在MySQL中,我想对表table1
和table2
进行外连接。
我想获得今天和昨天按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
我希望这是有道理的,希望有人可以提供帮助!
答案 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
如果出于某种原因,您希望将日期条件应用于h
和o
,但仅当有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