Mysql 按分组列分组?
我有一个类似节点的表,大致如下所示:Mysql 按分组列分组?,mysql,group-by,Mysql,Group By,我有一个类似节点的表,大致如下所示: lid nid uid type 1 23 3 like 2 23 1 like 3 49 3 dislike 4 11 6 like nid score type 307 4 like 307 1 dislike 404 24 like lid=此表的唯一ID,nid=“node”(内容)ID,uid=用户ID和类型是自解释的 使用此查询: SELECT nid, COUNT(lid) AS
lid nid uid type
1 23 3 like
2 23 1 like
3 49 3 dislike
4 11 6 like
nid score type
307 4 like
307 1 dislike
404 24 like
lid=此表的唯一ID,nid=“node”(内容)ID,uid=用户ID和类型是自解释的
使用此查询:
SELECT nid, COUNT(lid) AS score, type
FROM node_likes
INNER JOIN users ON node_likes.uid = users.uid
GROUP BY nid, type
我可以得到每个节点的喜欢和不喜欢分数。内部连接是无关的;有些(不喜欢)来自不再存在的用户,加入是为了消除他们
结果如下所示:
lid nid uid type
1 23 3 like
2 23 1 like
3 49 3 dislike
4 11 6 like
nid score type
307 4 like
307 1 dislike
404 24 like
然后,我如何按类型对该查询进行分组,并返回每个“喜欢”类型(喜欢/不喜欢)的最高评分节点ID
即
可能会成功。试试这个:
SELECT
nid, max(score) as score, type
FROM (
SELECT nid, COUNT(lid) AS score, type
FROM node_likes
INNER JOIN users ON node_likes.uid = users.uid
GROUP BY nid, type
) results
GROUP BY type
ORDER BY type DESC, score DESC
按分数顺序描述将为您提供顶级nid。我不确定你所说的子组是什么意思…ORDER by score DESC将返回最高分数,无论类型如何。我希望它返回每种类型的最高分数。混乱,喜欢/不喜欢的最高分数不应该都转到nid=404吗?非常抱歉,我输入的结果集错误了。我的错!它按分数和类型排序,但不会从中间删除无关的结果。这就是说,如果有一些帖子没有最高的“喜欢”评级,但是喜欢的比最高的“不喜欢”nid多,那么不管怎样,它们都会出现在最高的“不喜欢”nid之上。这很奇怪。它返回最高的分数,但NID不知何故被错误地关联起来。这一点也不奇怪。这就是为什么我在我的解决方案中添加了子字符串索引(GROUP_CONCAT…)的原因。@Vatev你是对的。或者,我的查询需要另一个条件来查找max(score)
关联的nid
。它以正确的顺序连接所有nid,然后在重新考虑后得到第一个nid,这看起来有点不太正常,但它完成了任务。
SELECT
SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY likes DESC),',',1) as most_likes_nid,
MAX(likes) as most_likes,
SUBSTRING_INDEX(GROUP_CONCAT(nid ORDER BY dislikes DESC),',',1) as most_dislikes_nid,
MAX(dislikes) as most_dislikes
FROM (
SELECT
nid,
COUNT(IF(type = 'like', 1, null)) as likes,
COUNT(IF(type = 'dislike', 1 ,null)) as dislikes
FROM node_likes
GROUP BY nid
) as t