Как вернуть несколько результатов в одном запросе? - PullRequest
1 голос
/ 16 марта 2019

Я написал запрос, который проверяет, обновлен ли team.Условие проверки обновления: если поле update_at из team превышает 7 дней с текущей даты, запись должна быть обновлена, например:

id | name     | update_at
67   Tirana     2019-03-06 11:00:12  
68   Partizan   2019-03-06 11:02:04  
69   Lusitanos  2019-03-14 09:00:40

SELECT id
FROM team
WHERE update_at < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
  AND id IN (67, 68, 69);

Запросработает хорошо, на самом деле результат выше: 67, 68, потому что запись 69 уже обновлена ​​(не соответствует условию).

Теперь предположим, что искомая запись нене существует в базе данных, запрос не вернет его (и это хорошо), но как я могу проверить, нужно ли добавлять запись вместо обновления?например:

id | name     | update_at
67   Tirana     2019-03-06 11:00:12  
68   Partizan   2019-03-06 11:02:04  
69   Lusitanos  2019-03-14 09:00:40

SELECT id
FROM team
WHERE update_at < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
AND id IN (67, 68, 69, 70);

результат даже 67, 68. Но в отличие от первого примера, здесь запись 70 не существует, так как я могу узнать, что с помощью одного запроса?

Возможен ли возврат двух результатов, таких как record_to_update и record_to_add?

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Вам нужно LEFT JOIN, используя производную таблицу или подобную логику.Например:

SELECT tt.team_id
FROM (SELECT 67 as team_id UNION ALL SELECT 68 UNION ALL
      SELECT 69 UNION ALL SELECT 70
     ) tt LEFT JOIN
     team t
     on t.id = tt.team_id AND
        update_at >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
WHERE t.id IS NULL;

Здесь - это дБ <> скрипка.

РЕДАКТИРОВАТЬ:

Если вы хотите проверить update против insert, вы можете сделать:

SELECT tt.team_id,
       (CASE WHEN t.id IS NULL THEN 'INSERT'
             ELSE 'UPDATE'
        END) as what_to_do
FROM (SELECT 67 as team_id UNION ALL SELECT 68 UNION ALL
      SELECT 69 UNION ALL SELECT 70
     ) tt LEFT JOIN
     team t
     on t.id = tt.team_id 
WHERE t.id IS NULL OR 
      t.update_at < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);

Здесь - соответствующая db <> скрипка.

Кстати, это интересный случай, когда LEFT JOINиспользуется, но фильтрация для второй таблицы содержится в предложении WHERE, а не в предложении ON.

0 голосов
/ 16 марта 2019

Используйте другую таблицу с идентификаторами, а затем выполните левое соединение между ними.

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