Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按分组列分组?_Mysql_Group By - Fatal编程技术网

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