1

我有两个这样的mysql表

CREATE  TABLE IF NOT EXISTS tbl1 (
`id` INTEGER(2) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ,
`name` VARCHAR(20) NOT NULL
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE  TABLE IF NOT EXISTS tbl2 (
`tbl_id` INTEGER(2) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ,
`id2` INTEGER(2) UNSIGNED NOT NULL ,
`email` VARCHAR(20) NOT NULL ,
FOREIGN KEY (`id2`) REFERENCES tbl1(`id`)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

这是 tbl1 中的示例数据

1   hello
2   world
3   happy
4   end

和 tbl2 中的示例数据

2   1   me@mail
3   2   my@mail
4   4   you@mail

现在我想选择姓名和电子邮件加入两个表。这是sql

select name,email from tbl1 t1,tbl2 t2 where t2.id2 = t1.id;

有了它,我得到了

hello   me@mail
world   my@mail
end     you@mail

但我想要 tbl1 中的所有行

hello   me@mail
world   my@mail
happy   null or nothing or 0
end     you@mail

我在这里卡住了。任何帮助将不胜感激。提前致谢。

4

1 回答 1

3

您应该使用LEFT JOIN

select name,email 
from tbl1 t1
LEFT JOIN tbl2 t2 
  on t1.id = t2.id2;

请参阅SQL Fiddle with Demo

您当前的查询使用的INNER JOIN将只返回两个表中匹配的行。即使 中没有匹配的行,也会LEFT JOIN返回中的所有记录。tbl1tbl2

如果您需要帮助学习连接语法,这里是连接的可视化解释

于 2013-01-29T17:24:13.697 回答