如何在同一查询中返回多个结果?

时间:2019-03-16 11:55:39

标签: 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_updaterecord_to_add

2 个答案:

答案 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 <>小提琴。

编辑:

如果要检查updateinsert,可以执行以下操作:

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的表,然后在它们之间进行左连接。