MySQL OUTER根据日期加入COUNTS

时间:2012-12-11 21:56:32

标签: mysql sql

在MySQL中,我想对表table1table2进行外连接。

我想获得今天和昨天按table2分组的相关code的计数,但我还希望能够看到计数为0的其他code类型这是我到目前为止所拥有的

SELECT h.code, count(h.code) as count, h.timestamp
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
GROUP BY h.code 

UNION 

SELECT h.code, count(h.code) as count, h.timestamp
FROM table1 h RIGHT OUTER JOIN table2 o ON h.code= o.code 
GROUP BY h.code 

所以我想申请这样的东西

WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1

但也包括table1中的所有记录,但计数为0

我希望这是有道理的,希望有人可以提供帮助!

3 个答案:

答案 0 :(得分:0)

嗯,你有一张包含所有代码的表吗?

select codes.code, coalesce(t.cnt) as cnt
from (select distinct code
      from table1
     ) codes left outer join
     (select code, count(*) as cnt
      from table1
      where timestamp >= CURRENT_DATE - INTERVAL 1
      group by code
     ) t
     on codes.code = t.code

该查询比必要的要复杂一些,因为它确实需要查询第一部分的代码表。如果你只有一个表,这是一个更简单的形式:

select code,
       sum(case when timestamp >= CURRENT_DATE - INTERVAL 1 then 1 else 0 end) as cnt
from table1
group by code

答案 1 :(得分:0)

  

所以我想申请这样的东西

     

WHERE h.timestamp> = CURRENT_DATE - INTERVAL 1

     

但也包括table1中的所有记录,但计数为0

如上所述,您正在复制h.code= o.code的结果。因此,在第二个查询中执行WHERE h.code is null的同时值得。因为这对于该查询意味着我们不想应用h上的条件,所以我们只是添加第一个查询。

SELECT h.code, count(h.code) as count, h.timestamp
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
 WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1
GROUP BY h.code 

UNION ALL

SELECT h.code, count(h.code) as count, h.timestamp
FROM table1 h RIGHT OUTER JOIN table2 o ON h.code= o.code 
WHERE h.code is null
GROUP BY h.code 

如果出于某种原因,您希望将日期条件应用于ho,但仅当有o的记录时才会将第一个where子句用于

WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1
      AND
      (o.timestamp >= CURRENT_DATE - INTERVAL 1
        or o.code is null)

答案 2 :(得分:0)

SELECT 
 h.code, 
 count(case h.code is null then 0 else 1 end) as count, 
 h.timestamp
FROM table1 h LEFT OUTER JOIN table2 o ON h.code= o.code 
WHERE h.timestamp >= CURRENT_DATE - INTERVAL 1
group by h.code