来自使用RIGHT JOIN的SQL查询的意外结果

时间:2013-01-31 19:42:44

标签: sql join

我有一个SQL查询,似乎返回一个意外的空行。此查询具有与另一个表的正确连接,但在返回行时,它返回一个空值..

  SELECT e.error_id, e.user_id, e.error_title, e.error_content, e.error_answers, 
         e.error_votes, e.error_views, e.error_added_date, u.user_name
  FROM errors e
  JOIN users u
    ON u.user_id=e.user_id
  RIGHT JOIN answers a
    ON a.error_id=e.error_id AND a.answer_accepted='1'
  GROUP BY e.error_id
  ORDER BY e.error_added_date DESC

这个查询应该返回一行但是它返回我预期的行和一行空值。为什么会这样?

条目

+----------------------------------------------------------------------------------------------------+
answer_id | error_id | user_id | answer_content | answer_accepted | answer_votes | answer_added_date |
1         | 3        | 1       | text           | 0               | 0            | 2013-01-31 12:49:12
2         | 3        | 1       | text           | 1               | 1            | 2013-01-31 12:52:29
3         | 3        | 1       | text           | 0               |-1            | 2013-01-31 12:53:45
4         | 2        | 1       | text           | 0               |-1            | 2013-01-31 12:53:45
+----------------------------------------------------------------------------------------------------+

结果:

+-------------------------------------------------------------------------------+
|   1 | 1    | text |  3   | 0    |  2   |  2013-01-29 16:56:20  |  Mihai Matei |
|NULL | NULL | NULL | NULL | NULL | NULL |       NULL            |  NULL        |
+-------------------------------------------------------------------------------+

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为您正在进行正确的加入。我想你想要一个Left Join或一个Inner Join。

右连接表示返回右侧的所有表行和左侧的匹配行。因为您的结果集不包含答案表(右表​​)中的任何列,所以您可以获得一组所有空值。换句话说,在答案表中有一行,错误和用户表中没有对应的行。

鉴于此答案的评论中有其他标准,这是我要尝试的查询:

  SELECT e.error_id, e.user_id, e.error_title, e.error_content, e.error_answers, 
         e.error_votes, e.error_views, e.error_added_date, u.user_name
  FROM errors e
  JOIN users u
    ON u.user_id=e.user_id
  LEFT JOIN answers a
    ON a.error_id = e.error_id and a.answer_accepted = '1'
  WHERE a.answer_id is null
  GROUP BY e.error_id
  ORDER BY e.error_added_date DESC