2010-08-28 1 views
0

Я пытаюсь выяснить, как запросить мою базу данных, чтобы она по существу сначала ЗАПИСАла мои результаты, а затем GROUP их ... Этот вопрос кажется, немного распространены, и я нашел примеры, но я до сих пор не совсем понимаю «как» сделать это и использовать примеры в моей собственной ситуации ... Итак, вся помощь, безусловно, ценится.Получение группы MySQL по запросу для отображения строки в этой группе с наивысшим значением

Вот моя MySQL таблица:

книга
book_id
BOOK_TITLE

пользователи
user_id
user_name

book_reviews
review_id
book_id
user_id
review_date (Unix дата временной метки)

Я хотел бы запросить 30 последних рецензий на книги. Они будут просто отображаться как:
Название книги
Имя пользователя рецензента

Однако я хотел бы, чтобы отобразить каждую книгу не более чем один раз. Поэтому обзор, показанный в списке, должен быть последним добавленным обзором. Для этого я просто группировался по имени book_name и упорядочивался с помощью review_date DESC. Но запрос таким образом не отображает запись с последним добавленным элементом review_date как сгруппированным по строке, поэтому мои данные неверны.

Вот мой текущий запрос:

SELECT books.books_title, users.user_name, book_reviews.review_id FROM books, users, book_reviews WHERE book_reviews.book_id = books.book_id AND book_reviews.user_id = users.user_id GROUP BY book_title ORDER BY review_date DESC LIMIT 30 

Из того, что я читал, кажется, что я должен иметь подзапрос, где я получаю значение MAX (review_date), но я до сих пор не понимаю, как соедините все это.

Спасибо тонну.

ответ

2

Использование:

SELECT x.book_title, 
     x.user_name 
    FROM (SELECT b.book_title, 
       u.user_name, 
       br.review_date, 
       CASE 
        WHEN @book = b.book_title THEN @rownum := @rownum + 1 
        ELSE @rownum := 1 
       END AS rank, 
       @book := b.book_title 
      FROM BOOKS b 
      JOIN BOOK_REVIEWS br ON br.book_id = b.book_id 
      JOIN USERS u ON u.user_id = br.user_id 
      JOIN (SELECT @rownum := 0, @book := '') r 
     ORDER BY b.book_title, br.review_date DESC) x 
    WHERE x.rank = 1 
ORDER BY x.review_date DESC 
    LIMIT 30 

MySQL не имеет аналитический/рейтинг/функциональные возможности кадрирования, но это занимает обзоры, где последние помечаются как 1. Это на на книгу основе ...

Я выставил дату проверки для заказа по последнему из последних, которые были внесены в книгу ...

+0

Спасибо за ответ OMG Ponies! Я до сих пор довольно неопытен с MySQL и никогда не занимался пользовательскими переменными или условиями CASE, поэтому я должен уметь учиться на этом ... Это говорит, что я получил ошибку, пытающуюся запустить это: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса, используемого рядом с «@book: = b.book_title FROM BOOKS b JOIN BOOK_REVIEWS b» в строке 10 – flight643

+0

@ flight643: Извините, у него не было запятой после «AS rank ». Выражения CASE почти идентичны выражениям SWITCH, если вы знакомы с ними. –

 Смежные вопросы

  • Нет связанных вопросов^_^