2012-07-24 120 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