MYSQL - 当 DO 存在和不存在时进行 SubSelect

标签 mysql sql subquery

情况概览

当前的问题是关于从表A( Material )表B(MaterialRevision)两个表中选择值的问题。但是,表 A 的 PK 可能存在或可能不存在于表 B 中。当它不存在时,此问题中描述的查询将不会返回表 A 的值,但它应该。所以基本上这是发生了什么:

查询仅在 A.id 存在于 B.id 中时才返回值,事实上,当 A.id 也不存在于 B.id 中时,我需要它从 A 返回值。

问题:

假设有两个表。表 Material 和表 Material 修订。 请注意,PK idMaterialMaterialRevision 中的 FK。

当前的“模拟”表 enter image description here

查询目标

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 JOINLEFT JOINRIGHT JOIN 的解释。 (如果您经常在查询中交叉表,您会爱上它们)

由于 m.obsolete 永远为真,我在 SELECT 子句中省略了它

关于MYSQL - 当 DO 存在和不存在时进行 SubSelect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53068528/

相关文章:

mysql - 在子查询中使用列,但不在主查询的 select 中使用列

MYSQL group by 和 inner join

mysql - 单个 MySQL 查询中的递归?

mysql - 'Escaping query values'在sql中如何安全? (或者为什么它是危险的?)[SQL 注入(inject)]

python - SQLite - 查询返回相关记录

php - mysql 使用 max 作为 where 条件

sql - 在 SQL 中检索插入的行 ID

mysql - RDS MySQL 错误 1045 (28000) : Access denied for user @IP (using password: YES)

mysql - 从一个表中选择第二个表中不存在的日期

mysql - “问题”和 'answers' 有多个答案