使用join显示空行

时间:2010-03-18 21:58:04

标签: sql mysql left-join join

在mysql中我从表中选择喊叫 拥有另一个名为“roleuser”的表的外键 匹配列为 user_id

现在某些行的shouts表中的user_id列为null (实际上并非null,但在mysql中没有插入)

如何使用user_id null显示shouts表的所有行

我正在执行sql语句

SELECT s.*, r.firstname, r.lastname
FROM shouts s left join roleuser r where r.user_id = s.user_id limit 50;

不执行并显示

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where r.user_id = s.user_id limit 50' at line 2

但是使用内部联接,sql执行显示行 在shouts表中只有user_id值。空值未显示。

SELECT s.*, r.firstname, r.lastname
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50;

如何显示shouts表中的所有行以及中的null值 在shouts表中user_id为null的firstname和lastname列。 如果没有尽可能用sql可能正在使用存储过程...

由于

Pradyut

2 个答案:

答案 0 :(得分:2)

您希望加入ON条款。

SELECT s.*, r.firstname, r.lastname
FROM  roleuser r 
  LEFT JOIN shouts s 
    ON s.user_id = r.user_id 
WHERE
    r.firstname like '%byron%' -- where clause goes here..

LIMIT 50;

答案 1 :(得分:2)

看起来你想要

SELECT s.*, r.firstname, r.lastname 
FROM shouts s left join roleuser r ON r.user_id = s.user_id limit 50;

您使用WHERE代替ON

您的第二个查询有效,因为

SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r where r.user_id = s.user_id limit 50; 

恰好提供与

相同的结果
SELECT s.*, r.firstname, r.lastname 
FROM shouts s inner join roleuser r ON r.user_id = s.user_id limit 50; 

尽管他们的意思略有不同。对于INNER JOIN,ON是可选的,如果你把它关闭,你得到第一个表中所有行的笛卡尔积和第二个表中的所有行,然后你的WHERE子句过滤排出所有不匹配的行。如果您将条件放在ON子句中,则连接仅计算匹配的行,并且您不需要在WHERE子句中添加条件。在任何一种情况下,内部联接的结果都是相同的。

但是,外连接没有等效的WHERE子句,因此其ON子句不是可选的。