Получение группы MySQL по запросу для отображения строки в этой группе с наибольшим значением - PullRequest
0 голосов
/ 28 августа 2010

Я пытаюсь выяснить, как сделать запрос к моей базе данных, чтобы она по существу сначала ЗАКАЗЫВАЛА мои результаты, а затем группировала их ... Этот вопрос, кажется, немного распространен, и я нашел примеры, но я все еще не совсем понять, как это сделать, и использовать примеры в моей собственной ситуации ... Так что всякая помощь определенно приветствуется.

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

книга
book_id
BOOK_TITLE

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

book_reviews
review_id
book_id
user_id
date_date (дата отметки времени unix)

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

Однако я хотел бы показать каждую книгу не более одного раза. Таким образом, обзор, показанный в списке, должен быть последним добавленным отзывом. Чтобы сделать это, я просто сгруппировался по названию книги и упорядочил по дате обзора. Но при таком запросе запись с последней добавленной датой 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), но я все еще не понимаю, как связать все это.

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

1 Ответ

2 голосов
/ 28 августа 2010

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

  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. Это для каждой книги ...

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

...