我写了一个查询,检查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
?
答案 0 :(得分:2)
您需要使用派生表或类似逻辑的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;
Here是db <>小提琴。
编辑:
如果要检查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);
Here是相应的db <>小提琴。
顺便说一句,这是一个有趣的情况,其中使用LEFT JOIN
,但是第二个表的过滤在WHERE
子句中,而不是在ON
子句中。
答案 1 :(得分:0)
使用另一个具有ID的表,然后在它们之间进行左连接。