作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了一个查询来检查 team
是否更新。检查更新的条件是:如果team
的字段update_at
距离当前日期大于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
?
最佳答案
您需要使用派生表或类似逻辑的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是一个数据库<> 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);
Here是对应的db<>fiddle.
顺便说一句,这是一个有趣的案例,其中使用了 LEFT JOIN
,但是对第二个表的过滤是在 WHERE
子句中,而不是 ON
子句。
关于mysql - 如何在同一个查询中返回多个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55196469/
我是一名优秀的程序员,十分优秀!