【问题标题】:Checking which of SQL conditions was met检查满足哪些 SQL 条件
【发布时间】:2017-05-20 14:47:01
【问题描述】:

我正在寻找一种更有效的方式来调试我的 SQL 查询,我正在使用 phpMyAdmin 进行大多数查询检查。下面是一个查询示例:

SELECT * FROM `schedule` WHERE
(
    `start` = {$start} OR
    ((`start` + (`runtime` * 60)) > {$start} AND (`start` + (`runtime` * 60)) <= {$end}) OR
    (`start` > {$start} AND `start` < {$end}) 
) AND `group_id` = {$group}

现在考虑到 $start 和 start 都是时间戳,当试图查看满足哪些条件(并且令人困惑)时,它会变得很烦人,有时这些条件可能很大(而不是像示例中的 3 个) ,有没有办法快速确定遇到了哪一个呢?无需手动删除它们中的每一个?

谢谢!

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:

    不是一个漂亮的解决方案,但您可以将每个条件添加到列列表中:

    SELECT *,
        IF (`start` = {$start}, 1, 0) AS con1,
        IF (((`start` + (`runtime` * 60)) > {$start} AND (`start` + (`runtime` * 60)) <= {$end}), 1, 0) AS con2,
    FROM `schedule` WHERE
    (
    `start` = {$start} OR
    ((`start` + (`runtime` * 60)) > {$start} AND (`start` + (`runtime` * 60)) <= {$end}) OR
    (`start` > {$start} AND `start` < {$end}) 
    ) AND `group_id` = {$group}
    

    【讨论】:

      【解决方案2】:

      您可以将布尔表达式放入选择列表中,并为它们指定有意义的列名。这些表达式将仅针对满足 WHERE 子句条件的行进行评估,因此不会产生显着的额外工作。这些表达式在查询结果集中返回 1(真)或 0(假)。

      SELECT ...,
        `start` = {$start} AS is_start,
        ((`start`+(runtime*60)) > {$start} AND (`start`+(runtime*60)) <= {$end}) AS is_overlapping,
        (`start` > {$start} AND `start` < {$end}) AS is_between_start_and_end
      FROM `schedule` 
      WHERE
      (
        `start` = {$start} 
        OR ((`start`+(runtime*60)) > {$start} AND (`start`+(runtime*60)) <= {$end}) 
        OR (`start` > {$start} AND `start` < {$end}) 
      ) AND group_id = {$group}
      

      【讨论】:

        猜你喜欢
        • 2016-12-28
        • 2020-03-07
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        相关资源
        最近更新 更多