通过查询获取MySQL组以显示具有最高值的该组中的行

时间:2010-08-28 04:50:38

标签: sql mysql greatest-n-per-group

我正在试图弄清楚如何查询我的数据库,以便它基本上首先对我的结果进行ORDER然后对它们进行GROUP ...这个问题似乎有点常见,我找到了例子,但我仍然不太掌握“如何”做到这一点并在我自己的情况下使用这些例子......所以所有的帮助都是绝对值得赞赏的。

以下是我的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)值,但我仍然不明白如何将它全部链接起来。

非常感谢。

1 个答案:

答案 0 :(得分: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的评论进行排名。这是基于每本书......

我将审核日期暴露给最新的每本书的最新订单......