我有一张table
content || category || views
-------------------------------
text 1 | cat2 | 1000
text 2 | cat2 | 1000
text 3 | cat1 | 500
text 4 | cat1 | 400
我想显示每个类别的最大值,但它显示为:
content || category || views
-------------------------------
text 1 | cat2 | 1000
text 2 | cat2 | 1000
text 3 | cat1 | 500
我的愿望输出:
content || category || views
-------------------------------
text 1 | cat2 | 1000
text 3 | cat1 | 500
基本上,我只想显示每个类别中的一个最大值,即使它有多个最大值。如果有多个最大值,那么我希望它显示按内容列列排序的第一个值,即文本1。
我运行的查询:
SELECT t1.*
FROM post t1
INNER JOIN
(
SELECT category, MAX(views) AS max_views
FROM post
GROUP BY category
) t2
ON t1.category = t2.category AND t1.views = t2.max_views order by views DESC
2条答案
按热度按时间hc2pp10m1#
有多种方法可以做到这一点。如果每行都有唯一的id,则可以执行以下操作:
如果您有主键,最好使用主键。如果你在上面有索引,上面的查询应该很快
post(category, views)
.你可以用
content
如果是唯一的:否则,就会出现某种多重聚合,例如:
当然,mysql 8+通过实现ansi标准来解决这个问题
ROW_NUMBER()
功能。我注意到您的查询使用泛型
t
作为表别名。那是个坏主意。您应该使用表名的缩写。它使查询更容易理解。jc3wubiy2#
您可以通过在子查询中选择每个类别中查看次数最多的内容以及最大查看次数来获得这些内容。
希望对你有帮助