我正在编写一个复杂的 MySQL 查询,但我无法弄清楚如何完成它。
这是给我带来麻烦的部分(这只是我查询的一部分):
SELECT * FROM table AS t1
WHERE date < (
SELECT date FROM table AS t2
WHERE phase="B" AND t2.target = t1.target
)
基本上,我有一些项目,每个项目都有一个日期、一个阶段(A、B、C)和一个目标。对于目标,有多个 A 类型的项目,然后是 B 类型的单个和可选项目,然后是 C 类型的项目。
对于每个目标,我想选择符合以下条件的所有行:
- 如果有一个阶段为“B”的项目(我们称他为 itemX),我想返回日期早于 itemX 日期的所有项目里>
- 如果没有阶段为“B”的项目,我想返回所有行
日期参数非常重要。在大多数情况下,这三个阶段是不同的,并且不能重叠,但在某些情况下会发生这种情况。
这里的问题是,我的子查询在情况 1 中不返回任何行,在情况 2 中不返回单个单元格。
如果我们处于情况 1,则整个情况 WHERE date < (...)
不相关,不应在查询中应用。
我尝试了几种可能性 IFNULL
和 EXISTS
,但我认为我做错了,因为我不断收到语法错误。
最佳答案
SELECT m.*
FROM (
SELECT target, MAX(date) AS maxdate
FROM mytable
) md
JOIN mytable m
ON m.target = md.target
AND m.date <
COALESCE
(
(
SELECT date
FROM mytable mb
WHERE mb.target = md.target
AND mb.phase = 'B'
ORDER BY
mb.target, pmb.phase, mb.date
LIMIT 1
),
maxdate + INTERVAL 1 SECOND
)
创建两个索引:
mytable (target, date)
mytable (target, phase, date)
为了让它快速工作。
关于mysql - 当子查询不返回任何行时删除 WHERE 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7043680/