首页 > 解决方案 > 如何在同一个查询中返回多个结果?

问题描述

我写了一个查询来检查 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_updaterecord_to_add

标签: mysqlsql

解决方案


您需要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。

编辑:

如果你想检查updatevs 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 JOINis used,但是对第二个表的过滤是在WHERE子句中,而不是ON子句中。


推荐阅读