情况概览
当前的问题是关于从表A( Material )和表B(MaterialRevision)两个表中选择值的问题。但是,表 A 的 PK 可能存在或可能不存在于表 B 中。当它不存在时,此问题中描述的查询将不会返回表 A 的值,但它应该。所以基本上这是发生了什么:
查询仅在 A.id 存在于 B.id 中时才返回值,事实上,当 A.id 也不存在于 B.id 中时,我需要它从 A 返回值。
问题:
假设有两个表。表 Material 和表 Material 修订。 请注意,PK idMaterial 是 MaterialRevision 中的 FK。
查询目标
Obs: remember these two tables are a simplification of the real tables.
对于每种 Material ,打印 Material 变量和来自 MaterialRevision 的最后一个 (MAX) RevisionDate。如果没有 RevisionDate,则打印空白 ("") 作为“最后修订日期”。
发生了什么错误
对于每种 Material ,打印 Material 变量和来自 MaterialRevision 的最后一个 (MAX) RevisionDate。如果 Material 没有修订,则不打印 Material (跳过)。
当前代码
SELECT
Material.idMaterial,
Material.nextRevisionDate,
Material.obsolete,
lastRevisionDate
FROM Material,
(SELECT MaterialRevision.idMaterial, max(MaterialRevision.revisionDate) as "revisionDate" from MaterialRevision
GROUP BY MaterialRevision.idMaterial
) AS Revision
WHERE (Material.idMaterial = Revision.idMaterial AND Material.obsolete = 0)
用于达到本题所述状态的引用和链接
Why is MAX() 100 times slower than ORDER BY ... LIMIT 1?
MySQL get last date records from multiple
MySQL - How to SELECT based on value of another SELECT
MySQL Query Select where id does not exist in the JOIN table
PS I hope this question is correctly understood since it took me a lot of time to build it. I researched a lot in stackoverflow and after several failed attempts I had no option but to ask for help.
最佳答案
你应该使用 JOIN
:
SELECT m.idMaterial, m.nextRevisionDate, mr.revisionDate AS "lastRevisionDate"
FROM Material m
LEFT JOIN MaterialRevision AS mr ON mr.idMaterial = m.idMaterial AND mr.revisionDate = (
SELECT MAX(ch.revisionDate) from MaterialRevision ch
WHERE mr.idMaterial = ch.idMaterial)
WHERE m.obsolete = 0
Here是对什么是 INNER JOIN
、LEFT JOIN
和 RIGHT JOIN
的解释。 (如果您经常在查询中交叉表,您会爱上它们)
由于 m.obsolete
永远为真,我在 SELECT
子句中省略了它
关于MYSQL - 当 DO 存在和不存在时进行 SubSelect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53068528/