从2个表中选择,获取行包括外键为null

时间:2018-12-04 10:39:24

标签: mysql

对不起,我的英语不好。

这是表日志

Log
id action product_id table
1  Insert 1          product
2  Read   null       product
3  Update 1          product

这是餐桌产品

Product
id name
1  A
2  B

我想做的是从日志中获取所有行,但有一定条件。
我尝试使用:

select log.id,log.action,product.name from log,product where log.product_id = product.id;

,但它仅返回包含product_id的行。 我认为这是因为日志的第2行与log.product_id = product.id

不匹配

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

FROM子句中用逗号分隔的表列表意味着CROSS JOIN.像您一样添加WHERE子句意味着INNER JOIN。您需要的是LEFT JOIN

您应该从老式的加入方式转变。您当前的查询是:

select log.id,log.action,product.name 
from log,product 
where log.product_id = product.id;

被重写为使用联接的样子:

select log.id,log.action,product.name 
from log 
inner join product on log.product_id = product.id;

这不是您想要的,因为您希望log表中的所有行都填充有product表中的信息。为此,您将使用外部联接,即此处为左联接。方法如下:

select log.id,log.action,product.name 
from log 
left join product on log.product_id = product.id;

答案 1 :(得分:0)

我不确定我的问题是对的,但是如果您还想在结果中包括空值,则可以进行左连接:

select log.id,log.action,product.name from log LEFT JOIN product ON log.product_id = product.id;

有关如何获取包含/不包含NULL的值的更多详细信息,请参见“内部联接”,“外部联接”,“左联接”,“右联接”。