MySQL中一个表为空时选择多个表
我正在努力MySQL中一个表为空时选择多个表,sql,mysql,Sql,Mysql,我正在努力 SELECT * FROM a, b 但是,如果其中一个表为空,它不会返回任何内容。如何使它返回“a”,即使另一个为空?在from子句中使用两个表在功能上等同于交叉联接: select * from A cross join B 这将为B中的每一行返回一行a。当B为空时,结果也为空。您可以通过使用左连接来修复此问题。使用左联接,即使其中一个表为空,也可以返回行。例如: select * from A left join B o
SELECT * FROM a, b
但是,如果其中一个表为空,它不会返回任何内容。如何使它返回“a”,即使另一个为空?在
from
子句中使用两个表在功能上等同于交叉联接:
select *
from A
cross join
B
这将为B中的每一行返回一行a。当B为空时,结果也为空。您可以通过使用左连接来修复此问题。使用左联接
,即使其中一个表为空,也可以返回行。例如:
select *
from A
left join
B
on 1=1
由于条件1=1
始终为真,这就像交叉连接
一样,只是它也适用于空表
SELECT * FROM a LEFT JOIN b ON a.ID = b.ID
即使b为空,也将从a返回所有内容。您应该执行左联接
像这样
SELECT *
FROM A
LEFT JOIN B ON A.ID = B.ID
然后您将收到A中的行和B中的相应行(如果存在)。上述查询显示两个表的联接。如果A包含2条记录,B包含7条记录,则显示7*2=14条记录。在您的情况下,其中一个表为空(包含0条记录),它将不显示任何数据。如果仍要显示数据且表没有任何关系,则需要检查两个表的计数是否大于0。否则,只显示一个非空表中的记录
SELECT a.*, b.* FROM a LEFT JOIN b ON a.id = b.id
在这个示例中,id只是join key的示例名称您使用的是内部连接
的形式,结果是x*y记录,因此如果其中一个记录有0行,那么x*0=0.FYI,“在MySQL中,交叉连接在语法上等同于内部连接(它们可以相互替换)”@Imre L:interest。如果在
子句上没有的话,按照惯例使用交叉连接
可能更清晰,即使MySQL允许内部连接
用于相同的目的!对我个人更喜欢省略单词internal
和CROSS
,等等。但我不喜欢在联接表上使用某些条件时使用内联交叉联接。如果在表a上使用返回0行的WHERE子句(表不是空的),则不起作用。我也试着在表A和表B之间切换,但仍然没有返回任何记录。如果假设有字段要连接,则可能没有公共字段。如果没有公共字段,这将无法工作。请参见答案中的ON 1=1。假设有字段要连接,可能没有公共字段。如果没有公共字段,这将无法工作。请参见答案中的ON 1=1。假设有字段要连接,可能没有公共字段。如果没有公共字段,这将无法工作。请参见答案中关于1=1的说明。这是整个问题的关键,在没有公共字段的情况下连接空集。是的,你是对的,在这种情况下,需要交叉连接,或者条件1=1几乎相同。