使用DISTINCT(几列)和MAX(另一列)计算行数

时间:2013-01-20 23:11:09

标签: mysql sql select

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

id, user_id, item_id, vote, utc_time

只有 ID 是一个唯一字段, user_id utc_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

1 个答案:

答案 0 :(得分: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