gpt4 book ai didi

mysql - 选择子查询中列是否为空的位置

转载 作者:行者123 更新时间:2023-11-29 03:10:16 25 4
gpt4 key购买 nike

我有 2 个表,其中包含名称和与这些名称相关的日期表。我正在尝试获取过去 2 个月内从未安排或未安排的所有名称的列表。

   SELECT n.name, MAX(s.date) 
FROM names n
LEFT JOIN schedule s ON n.id = s.nameid
WHERE s.nameid IS NULL
OR s.nameid NOT IN (SELECT nameid
FROM schedule
WHERE date > NOW() - INTERVAL 2 MONTH)
GROUP BY n.id

当我运行这个查询时,MySQL 接管了 CPU 并且没有响应。

当我将其更改为其中任何一个时,我得到了结果,但只有我正在寻找的结果的一半:

   SELECT n.name, MAX(s.date) 
FROM names n
LEFT JOIN schedule s ON n.id = s.nameid
WHERE s.nameid IS NULL
GROUP BY n.id

SELECT n.name, MAX(s.date)
FROM names n
LEFT JOIN schedule s ON n.id = s.nameid
WHERE s.nameid NOT IN (SELECT nameid
FROM schedule
WHERE date > NOW() - INTERVAL 2 MONTH)
GROUP BY n.id

我不确定如何让这个查询工作以返回所有结果或者它为什么会占用 CPU。

最佳答案

OR 在我能想到的每个数据库中都是出了名的性能差。 UNION 如果通常是更好的选择:

   SELECT n.name, MAX(s.date) 
FROM names n
LEFT JOIN schedule s ON n.id = s.nameid
WHERE s.nameid IS NULL
GROUP BY n.id
UNION
SELECT n.name, MAX(s.date)
FROM names n
LEFT JOIN schedule s ON n.id = s.nameid
WHERE s.nameid NOT IN (SELECT nameid
FROM schedule
WHERE date > NOW() - INTERVAL 2 MONTH)
GROUP BY n.id

UNION 将删除重复项——如果不担心重复项,请使用 UNION ALL(速度更快,因为它不会删除重复项)。

此外,后一个查询在 WHERE 子句中有针对 OUTER JOIN 表的条件——此条件在 JOIN 之后应用。使用以下方法可能会得到不同的结果:

   SELECT n.name, MAX(s.date) 
FROM names n
LEFT JOIN schedule s ON s.nameid = n.id
AND s.nameid NOT IN (SELECT nameid
FROM schedule
WHERE date > NOW() - INTERVAL 2 MONTH)
GROUP BY n.id

在上面的示例中,条件将在 OUTER JOIN 之前应用。对于 INNER JOIN,可以忽略这一点——任一位置的标准都是等效的。

关于mysql - 选择子查询中列是否为空的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com