我有一个奇怪的问题。我有一个用户表,其中每个用户都有一个唯一的用户ID。用户可以发布保存到不同表的注释(提示),每个注释行也具有唯一ID,并且还包含发布它的用户的用户ID。最后,其他用户可以对评论进行投票。投票存储在另一个表中,同时还有投票人的用户ID,以及投票评论的评论ID(无唯一ID)。
我将一个人的评分计算为向上投票数减去向下投票的数量,因此4向上和向下2将导致评级为2,简单。我希望有一个可以按人评级排序的会员列表,但我有点问题。
我使用COUNT()和CASE来确定上下投票的数量:
(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating',
当我向查询提供单个用户ID时,在WHERE子句中,WHERE user_id = 1,这是有效的。但是,我想获得所有成员及其评级的列表,这就是问题发生的地方。我的问题:
SELECT DISTINCT
U.user_id,
(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating',
username
FROM users U
LEFT JOIN tips T ON U.user_id = T.user_id
LEFT JOIN votes V ON T.tip_id = V.tip_id
基本上,这应该找到投票中的所有行,其中tip_id等于提示表中的tip_id,然后提示<中的所有行/ strong>表,其中user_id等于用户表中的user_id。我遇到的问题是我只返回一行,即使users表中有83行。票数表中共有287行,票数为257票,票数为30票。我获得的这一行的评级为227(即257-30),这意味着计票表中的所有行都被计算,而不仅仅是我正在寻找的特定user_id的行。我希望获得每个用户对其所有提示的上下投票数量。
基本上,对于users表中的每个user_id,它应该找到该用户id的所有tip_id,然后是那些tip_id的所有投票。
这是不可能的,还是我错过了一些非常明显的东西?
编辑:我应该注意,如果我完全删除COUNT()行,那么查询工作,返回正确的行数...它只是没有投票信息。
答案 0 :(得分:0)
SELECT
U.user_id,
(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating',
username
FROM users U
LEFT JOIN tips T ON U.user_id = T.user_id
LEFT JOIN votes V ON T.tip_id = V.tip_id
GROUP BY U.user_id, rating, username
我没有测试它。但我认为你错过了group by子句。