Как вернуть несколько результатов в одном запросе?

#mysql #sql

#mysql #sql

Вопрос:

Я написал запрос, который проверяет, обновлен ли 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 ?

Ответ №1:

Вам нужно 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;
  

Здесь есть db<>fiddle .

Редактировать:

Если вы хотите проверить 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<>fiddle.

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

Комментарии:

1. Спасибо за это, просто вопрос: я не понимаю, является ли это другим запросом или мой улучшен, потому что вы всегда возвращаете team_id, как я могу распознать, нужно ли обновлять или добавлять команду?

2. @sfarzoso . . . Я не понимаю вашего комментария. Это отвечает на вопрос.

3. Я сказал: как ваш запрос может подсказать мне, какую запись нужно обновить, а какую добавить?

4. @sfarzoso . . . Я думаю, вы в замешательстве, потому что я не включил 70 в производную таблицу. Я добавил db<>fiddle, чтобы вы могли видеть, как это работает.

5. Да, я видел скрипт, если вы посмотрите на результат, 70 добавляется, но я не знаю, нужно ли обновлять или добавлять эту запись, потому что в таблице не существует, здесь есть недоразумение

Ответ №2:

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