mysql - 当子查询不返回任何行时删除 WHERE 条件

标签 mysql sql subquery

我正在编写一个复杂的 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 类型的项目。

对于每个目标,我想选择符合以下条件的所有行:

  1. 如果有一个阶段为“B”的项目(我们称他为 itemX),我想返回日期早于 itemX 日期的所有项目
  2. 如果没有阶段为“B”的项目,我想返回所有行

日期参数非常重要。在大多数情况下,这三个阶段是不同的,并且不能重叠,但在某些情况下会发生这种情况。

这里的问题是,我的子查询在情况 1 中不返回任何行,在情况 2 中不返回单个单元格。

如果我们处于情况 1,则整个情况 WHERE date < (...)不相关,不应在查询中应用。

我尝试了几种可能性 IFNULLEXISTS ,但我认为我做错了,因为我不断收到语法错误。

最佳答案

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/

相关文章:

apache 网络服务器中的 MySql

mysql - 如何使用日期时间作为计数器不断循环多行

mysql - sql简单初学者操作

mysql - 选择每组的最后 30 个项目

Mysql - 从分组数据中获取n个结果

php - 删除 url 末尾的字符

php - 如何使用 PHP API 和 AngularJS 2 服务正确处理/获取正确的 JSON 响应?

MYSQL 从表中删除第一个重复项

mysql - 插入具有来自另一个子查询的值的行

MySQL查询,(从子查询访问主查询)