我的表包含不同项目的用户投票。它包含以下列:
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
答案 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