通过查询获取MySQL组以显示该组中具有最高值的行 [英] Getting a MySQL group by query to display the row in that group with the highest value

查看:90
本文介绍了通过查询获取MySQL组以显示该组中具有最高值的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试找出如何查询数据库的方法,这样它实际上将首先对我的结果进行排序,然后对它们进行分组...这个问题似乎有点普遍,我已经找到了示例,但我仍然不太了解掌握操作方法"并在我自己的情况下使用示例....因此,我们非常感谢所有帮助.

I'm trying to figure out how to query my database so that it will essentially first ORDER my results and then GROUP them... This question seems to be slightly common and I have found examples but I still don't quite grasp the 'how' to do this and use the examples in my own situation.... So all help is definitely appreciated.

这是我的MySQL表:

Here are my MySQL tables:

书籍
book_id
book_title

books
book_id
book_title

用户
user_id
用户名

users
user_id
user_name

book_reviews
review_id
book_id
user_id
review_date(unix时间戳日期)

book_reviews
review_id
book_id
user_id
review_date (unix timestamp date)

我想查询30条最新书评.它们将简单显示为:
书名
审阅者的用户名

I would like to query 30 of the latest book reviews. They will simply display as:
Book Name
Username of Reviewer

不过,我希望每本书最多显示一次.因此,列表中显示的评论应该是最近添加的评论.为此,我只是按book_name分组,并按review_date DESC排序.但是以这种方式查询不会显示最新添加的review_date作为按行分组的记录,因此我的数据不正确.

However I would like to display each book no more than one time. So the review shown in the list should be the most recently added review. To do this I have been simply grouping by book_name and ordering by review_date DESC. But querying this way doesn't display the record with the most recently added review_date as the grouped by row so my data is incorrect.

这是我当前的查询:

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)值,但我仍然不知道如何将其全部链接起来.

From what I've read it seems like I have to have a subquery where I get the MAX(review_date) value but I still don't understand how to link it all up.

一吨.

推荐答案

使用:

  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.这是每本书的基础...

MySQL doesn't have analytical/ranking/windowing functionality, but this ranks the reviews where the latest is marked as 1. This is on a per book basis...

我按书中最新的顺序列出了检查日期,以按顺序排列...

I exposed the review date to order by the latest of those which are the latest per book...

这篇关于通过查询获取MySQL组以显示该组中具有最高值的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆