#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:
Используйте другую таблицу с идентификаторами, а затем выполните левое соединение между ними.