mysql - 如何在同一个查询中返回多个结果?
问题描述
我写了一个查询来检查 ateam
是否已更新。检查更新的条件是:如果 的字段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
?
解决方案
您需要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
vs 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。
顺便说一句,这是一个有趣的案例 where LEFT JOIN
is used,但是对第二个表的过滤是在WHERE
子句中,而不是ON
子句中。
推荐阅读
- java - 添加此 servlet 代码服务器时停止
- c++ - 使用反向迭代器的中点
- tcl - 从 tcl 中的给定路径中删除大括号
- javascript - 尽管被捕获,但在生成器中抛出的错误完成了它
- java - FirebaseRecyclerAdapter DatabaseException:无法将 java.lang.String 类型的对象转换为 Posts 类型
- user-interface - 是否有现成的 UI 可以在 ASP.NET 中编辑数据库表?
- javascript - Simple React Native iOS App 未在 xcode 和命令行中运行
- delphi - 如何在匿名方法中捕获变量?
- jquery - 如何在传递给 api 之前对 Excel 工作表数据进行编码
- python - 在 Django rest api 中缓慢的互联网连接时更新数据