2017-01-05 8 views
1

Я ищу более эффективный способ отладки моих SQL-запросов, я использую phpMyAdmin для большинства проверок запросов. Вот пример запроса:Проверка выполнения условий SQL

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 оба метки времени он получает раздражает, когда пытаются узнать, какие из условий было выполнено (и запутанным), иногда эти условия могут быть в больших количествах (а не 3, как в примере), есть ли способ быстро определить, какой из них был встречен? Без ручного удаления каждого из них?

Спасибо!

ответ

0

Не красивое решение, но вы можете добавить каждое условие в списке столбцов:

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} 
0

Вы можете поместить логические выражения в списке выбора, и дать им осмысленные имена столбцов. Эти выражения будут оцениваться только для строк, которые удовлетворяют условиям предложения WHERE, поэтому это не является существенной дополнительной работой. Эти выражения возвращают либо 1 (true), либо 0 (false) в наборе результатов запроса.

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} 
Смежные вопросы