使用LEFT JOIN进行奇怪的MySQL行为

时间:2011-08-05 02:46:09

标签: mysql join left-join

我有一个奇怪的问题。我有一个用户表,其中每个用户都有一个唯一的用户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()行,那么查询工作,返回正确的行数...它只是没有投票信息。

1 个答案:

答案 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子句。