2012-07-24 108 views
0

我有节点喜欢的一个表,它看起来大致是这样的:按分组列排序?

lid nid uid type 
1 23 3 like 
2 23 1 like 
3 49 3 dislike 
4 11 6 like 

盖此表=唯一的ID,NID =“节点”(内容)的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 

我可以得到它就像每个节点和不喜欢的分数。内部连接无关紧要;一些(dis)喜欢来自不再存在的用户,并且联合会消除它们。

结果看起来是这样的:

nid score type 
307 4  like 
307 1  dislike 
404 24 like 

我怎么能那么子组此查询type,并返回得分最高的节点ID为每一个“喜欢”型(喜欢/不喜欢)?

即,

nid score type 
404 24 like 
307 1  dislike 
+0

ORDER BY DESC分给你顶NID的。我不确定你的分组是什么意思... – Vatev 2012-07-24 17:42:27

+0

ORDER BY得分DESC将返回最高得分,不论其类型如何。我希望它能够返回每种类型的最高分数。 – felamaslen 2012-07-24 17:43:25

+0

混淆,不应该为喜欢/不喜欢的最高分进入nid = 404? – ajreal 2012-07-24 17:52:09

回答

2
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 
+0

它的工作原理。我不知道如何(但),但它的作品。谢谢! – felamaslen 2012-07-24 18:12:54

+0

它将所有nid的顺序连接在一起,然后得到第一个 – Vatev 2012-07-24 18:16:35

+0

第二个想法,它确实看起来是一个*小*哈克,但它的工作。 – felamaslen 2012-07-24 19:19:33

0
SELECT nid, COUNT(lid) AS score, type 
    FROM node_likes 
    INNER JOIN users ON node_likes.uid = users.uid 
    GROUP BY nid, type   
    ORDER BY type DESC, score DESC; 

可以做的伎俩。

+0

按分数和类型排序,但不会从中间删除多余的结果。也就是说,如果有帖子没有顶级“喜欢”等级,但比顶级“不喜欢”NID有更多喜欢,他们会出现在顶级“不喜欢”NID之上。 – felamaslen 2012-07-24 17:57:07

0

试试这个:

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 
+0

这很奇怪。它返回最高的分数,但nid以某种方式错误地关联。 – felamaslen 2012-07-24 18:06:05

+0

这并不奇怪。这就是为什么我在我的解决方案中添加SUBSTRING_INDEX(GROUP_CONCAT ...)黑客的原因。 – Vatev 2012-07-24 18:09:05

+0

@Vatev你是对的。或者,我的查询需要另一个条件来查找'max(score)'关联的'nid'。 – 2012-07-24 18:21:16