1

我的表包含用户对不同项目的投票。它具有以下列:

id, user_id, item_id, vote, utc_time

只有id是唯一字段,并且user_idutc_time的组合可能也是唯一的。但用户可以多次为任何项目投票。

投票不是一个数字,而是具有几个可能值之一(例如,“糟糕”、“糟糕”、“好”、“优秀”)。

我需要计算有多少不同的用户对给定的#item#投了最后一票作为“优秀”、“好”等。所以假设我只有四个不同的可能投票值,我需要获得以下四个记录领域:

vote, count_of_users

我了解如何计算所有选票,而不仅仅是用户的最后一票:

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

但我无法弄清楚如何只计算每个用户的 utc_time = MAX(utc_time) 的票数......感谢您的帮助。

这个问题与我的上一个问题有关:Select one row with MAX(column) for known other several columns without subquery

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 回答