Mysql 为什么左外部联接减少左表中的行?

Mysql 为什么左外部联接减少左表中的行?,mysql,join,correlated-subquery,Mysql,Join,Correlated Subquery,只想显示表A中的所有数据,并使用coorelate子查询左连接表B,但无法获取表A中的所有数据 SELECT a.id FROM tableA a LEFT JOIN tableB b1 ON a.id = b1.id WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id) 表 身份证件 ====== 1001 1002 1003 1004 表B 身份证日期 ============= 1001 20160101 1

只想显示表A中的所有数据,并使用coorelate子查询左连接表B,但无法获取表A中的所有数据

SELECT a.id FROM tableA a 
LEFT JOIN tableB b1 ON a.id = b1.id
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id)
表 身份证件 ====== 1001 1002 1003 1004 表B 身份证日期 ============= 1001 20160101 1001 20160102 1003 20160102 1003 20160105 预期结果 身份证日期 =============== 1001 20160102 1002空 1003 20160105 1004空 发动机回油 身份证日期 ============= 1001 20160102 1003 20160105
将您的查询更新为:

SELECT a.id, b1.date FROM tableA a 
LEFT outer JOIN tableB b1 ON a.id = b1.id
WHERE date = (SELECT MAX(date) FROM tableB b2 WHERE b1.id= b2.id) or date is null

我要做的是在子选择上进行左连接,它只包含每个id的最大日期,如下所示:

SELECT a.id, b.maxdate FROM tableA a 
LEFT JOIN (SELECT id, MAX(date) AS 'maxdate' FROM tableB2 GROUP BY id) b ON a.id = b.id

这也应该更快,因为连接的select只执行一次,而where子句中的select将对每一行执行。

where子句应用于连接的数据集,因此where条件将从结果集中删除那些与条件不匹配的记录

我将您的子查询移动到from子句:

SELECT a.id FROM tableA a 
LEFT JOIN (SELECT MAX(date) as mdate, id FROM tableB GROUP BY id) b1 ON a.id = b1.id

我认为您的subselect将返回每行整个表的MAX(date),如果它不是按id分组的,否则它与我的解决方案相同;-)谢谢,错过了那一个。它仍然是不正确的,但鉴于Fuzzzel已经确定了它,删除可能就足够了。谢谢你的解释。你澄清了我的想法,谢谢!将“WHERE”改为“AND”,并丢失“or date is null”位,或者只使用上面更好的答案。
SELECT a.id FROM tableA a 
LEFT JOIN (SELECT MAX(date) as mdate, id FROM tableB GROUP BY id) b1 ON a.id = b1.id