0

ノードいいねのテーブルがあります。これはおおよそ次のようになります。

lid nid uid type
1   23  3   like
2   23  1   like
3   49  3   dislike
4   11  6   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

好き嫌いのスコアで各ノードを取得できます。内部結合は関係ありません。いくつかの(嫌いな)好きなものは、もはや存在しないユーザーからのものであり、参加はそれらを排除することです。

結果は次のようになります。

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

type次に、このクエリをでサブグループ化し、「好き」タイプ(好き/嫌い)ごとに最高スコアのノードIDを返すにはどうすればよいですか?

つまり。

nid score type
404 24    like
307 1     dislike
4

3 に答える 3

1
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
于 2012-07-24T18:00:52.987 に答える
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; 

トリックを行う可能性があります。

于 2012-07-24T17:52:33.327 に答える
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
于 2012-07-24T17:58:51.330 に答える