Как объединить два запроса, которые сравнивают разные результаты? - PullRequest
1 голос
/ 14 марта 2019

У меня есть таблица с именем match, которая содержит все matches футбольного соревнования. Структура таблицы следующая:

id | round_id | datetime | status | home | away | result

по существу каждый match имеет status, которые указывают:

  1. Запланированные
  2. Перенесенные
  3. Отменено
  4. Игра
  5. Закончено

есть также round_id, указывающий ссылку на competition.

В моем приложении я проверяю каждый раз, нужно ли обновлять конкретный round. Для этого сначала я проверяю, все ли matches лиги имеют статус 3 или 5. Запрос следующий:

SELECT (COUNT(*) = SUM(status in (3, 5)) 
                   AND COUNT(*) = 380) AS result 
                   FROM `match` WHERE round_id = 10

Так что, если 380 совпадения отменены или завершены, то round 10 обновляется.

Если результат запроса выше ложен, поэтому раунд должен быть обновлен, тогда я должен проверить, какой matches должен быть обновлен.

Для этого я написал следующий запрос:

SELECT COUNT(*) AS result FROM `match` m2 
                   WHERE m2.round_id = 10
                   AND m2.datetime < NOW() AND m2.status IN (1, 2)

запрос выше проверяет, есть ли matches с datetime ниже, чем текущий, и если их статус 1 или 2, конкретно (запланировано и отложено).

Я не очень доволен своей реализацией по следующим причинам:

  1. Мне нужно выполнить два запроса для проверки необходимости обновления.
  2. Последний запрос возвращает номер match, но моя цель - вернуть boolean. К сожалению, мои навыки sql не настолько развиты.

Можно ли объединить эти два запроса в один для простой проверки?

Заранее спасибо за помощь.

ОБНОВЛЕНИЕ - БАЗА ДАННЫХ СО СТРУКТУРОЙ ДАННЫХ :

id | round_id |        datetime      | status | home | away | result
 1      10      2018-08-15 00:00:00      5        A      B     1-0
 2      10      2018-08-15 00:00:00      5        C      D     1-1
 3      10      2018-08-15 00:00:00      5        E      F     2-1
 4      10      2018-08-15 00:00:00      5        G      H     2-2

все вышеприведенные matches обновлены, так как статус 5, поэтому round 10 не нуждается в обновлении. Первый запрос вернет true, а второй запрос вернет 0.

Рассмотрим теперь этот пример:

id | round_id |        datetime      | status | home | away | result
 1      11      2018-08-15 00:00:00      5        A      B     1-0
 2      11      2019-08-15 00:00:00      1        C      D      
 3      11      2019-01-15 00:00:00      5        E      F     2-1
 4      11      2019-03-12 00:00:00      1        G      H      

round 11 необходимо обновить, потому что у нас запланировано 2 matches, но только match с id 4 уже сыграно, поэтому запрос должен вернуть false, потому что round 11 не обновляется.

1 Ответ

1 голос
/ 14 марта 2019

Я думаю, вы хотите что-то вроде этого:

SELECT (COUNT(*) = SUM(status in (3, 5)) AND
        COUNT(*) = 380 AND
        SUM(mdatetime < NOW() AND status IN (1, 2)) = 0
       ) AS result 
FROM `match`
WHERE round_id = 10;

Я думаю, вы просто хотите проверить, возвращает ли второй запрос число больше 0. В любом случае вы можете объединить все эти условия в один логический результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...