SQL查询以查找类别中的前3个

史蒂文斯普莱德

呼吁所有sql爱好者!快速信息:使用PostgreSQL。

我有一个查询,返回每个类别用户的最大点赞次数。我现在想要的是显示每个类别中最喜欢的前3个用户。

一个有用的资源正在使用此示例来解决问题:

select type, variety, price
from fruits
where (
   select count(*) from fruits as f
   where f.type = fruits.type and f.price <= fruits.price
) <= 2;

我理解这一点,但是我的查询使用的是联接,而且我还是一个初学者,所以我无法有效地使用此信息。

顺便说一句,这是我的查询,用于针对每个类别返回用户的MAX个赞。

SELECT category, username, MAX(post_likes) FROM (
SELECT c.name category, u.username username, SUM(p.like_count) post_likes, COUNT(*) post_num
FROM categories c
JOIN topics t ON c.id = t.category_id
JOIN posts p ON t.id = p.topic_id
JOIN users u ON u.id = p.user_id
GROUP BY c.name, u.username) AS leaders
WHERE post_likes > 0
GROUP BY category, username
HAVING MAX(post_likes) >= (SELECT SUM(p.like_count) 
                          FROM categories c 
                          JOIN topics t ON c.id = t.category_id 
                          JOIN posts p ON t.id = p.topic_id 
                          JOIN users u ON u.id = p.user_id WHERE c.name = leaders.category
GROUP BY u.username order by sum desc limit 1)
ORDER BY MAX(post_likes) DESC;

任何和所有帮助将不胜感激。我很难解决这个问题。谢谢!

戈登·利诺夫(Gordon Linoff)

如果您希望每个类别的喜欢最多,请使用窗口功能:

SELECT cu.*
FROM (SELECT c.name as category, u.username as username, 
             SUM(p.like_count) as post_likes, COUNT(*) as post_num,
             ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY COUNT(*) DESC) as seqnum
      FROM categories c JOIN
           topics t
           ON c.id = t.category_id JOIN
           posts p
           ON t.id = p.topic_id JOIN
           users u
           ON u.id = p.user_id
      GROUP BY c.name, u.username
     ) cu
WHERE seqnum <= 3;

即使存在联系,每个类别始终返回三行。如果您想做其他事情,请考虑DENSE_RANK()RANK()代替ROW_NUMBER()

另外,asFROM子句中使用列别名尽管是可选的,但有一天您会省略逗号,并感谢您有使用的习惯as

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 SQL 如何编写查询以查找每月每个类别的前 5 个?

(类别列中的项目顺序不正确)编写 SQL 查询以生成前 5 个类别的排名列表

弹性搜索查询,返回每个类别的前3个

Oracle SQL:每个“类别”获得前3个结果

mysql查询从3个类别中获取随机项目

如何从3个类别的数据帧的前2个类别中删除1行?

仅查询Dict中的前3个

SQL Server:从前3个类别中选择前3个项

Oracle SQL在新表中插入前3个子查询

如何在Laravel雄辩的查询中获取前10个类别列表

MySQL查询在表中查找最新的3个日期

从数组mongodb中查找前3个值

查找前三个相关类别及其对应的概率

一个 Django 查询,用于查找评论最多的前 3 个帖子

“按日期查找前5个查询”

Oracle查询以查找前2个条目

在SQL Server中捕获前100个昂贵的查询(<2014)

嵌套查询中的 SQL 前 10 个结果

Google查询返回每个类别的前N个结果

两个类别中的MySQL查询检索标签(“与非”或“非”)[WordPress Raw SQL]

查找数据集中可用的每个国家/地区的前 2 个供应商?- 大查询 SQL

在查询中查找SQL表

从SQL查询中查找序列

在SQL查询中满足条件时,使用前3个字符使用***显示字段的结果

查询从SQL中的3个表中检索信息?

根据SQL中多个列中的条件创建具有3个类别的Status列

sqlite3查询以在排序的记录中查找不同的前1名

在一个很长的sql文件中查找第n个查询

在两个不同的子 SQL 查询中查找两个不同列之间的差异