1

私のテーブルには、さまざまなアイテムに対するユーザーの投票が含まれています。次の列があります。

id, user_id, item_id, vote, utc_time

idのみが一意のフィールドであり、user_idutc_timeの組み合わせもおそらく一意です。ただし、ユーザーは任意のアイテムに何度でも投票できます。

投票は数値ではなく、いくつかの可能な値 (「ひどい」、「悪い」、「良い」、「優れた」など) のいずれかを持ちます。

特定の#item#に対して、最後の投票を「非常に良い」、「良い」などと投票したユーザーの数を数える必要があります。したがって、可能な投票値が 4 つしかないと仮定すると、次の 4 つのレコードを取得する必要があります。田畑:

vote, count_of_users

ユーザーの最後の投票だけでなく、すべての投票をカウントする方法を理解しています。

SELECT vote, COUNT(id) FROM votes WHERE item_id=#item# GROUP BY vote;

しかし、各ユーザーの utc_time = MAX(utc_time) の投票のみをカウントする方法がわかりません...助けてくれてありがとう。

この質問は私の前の質問に関連しています:サブクエリなしで既知の他のいくつかの列に対してMAX(列)で1つの行を選択してください

4

1 に答える 1

2

それがあなたに合っている場合は、この解決策を試してください。

SELECT  a.item_ID,
        SUM(CASE WHEN a.vote = 'awful' THEN 1 ELSE 0 END) awful,
        SUM(CASE WHEN a.vote = 'bad' THEN 1 ELSE 0 END) bad,
        SUM(CASE WHEN a.vote = 'good' THEN 1 ELSE 0 END) good,
        SUM(CASE WHEN a.vote = 'excellent' THEN 1 ELSE 0 END) excellent
FROM    tableName a
        INNER JOIN
        (
            SELECT  user_ID, MAX(utc_time) max_time
            FROM    tableName
            GROUP   BY user_ID
        ) b ON a.user_ID = b.user_ID AND
                a.utc_time = b.max_time
-- WHERE   a.item_ID = 'valueHere'
GROUP   BY a.item_ID

更新 1

SELECT  a.item_ID,
        a.vote,
        COUNT(*) totalCount
FROM    tableName a
        INNER JOIN
        (
            SELECT  user_ID, MAX(utc_time) max_time
            FROM    tableName
            WHERE   item_id = 'valueHere'
            GROUP   BY user_ID
        ) b ON  a.user_ID = b.user_ID AND
                a.utc_time = b.max_time
GROUP   BY a.vote
于 2013-01-20T23:17:46.170 に答える