以下の相関サブクエリがあります。table1 の各 ID (147,148,149) には、table2 に多くのレコードがあります。ただし、ID 148 には、ステートメントの時間条件に一致するレコードがありません。したがって、出力には含まれません。カウント列に0を含めたい。何を変更する必要がありますか?
SELECT b.fkid, COUNT(DISTINCT username)
FROM table2 AS b
WHERE
b.fkid IN ( 147,148,149 )
AND time > (SELECT SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) FROM table1 AS a WHERE a.id = b.fkid)
GROUP BY b.fkid
このステートメントは次を返します。
b.fkid COUNT(DISTINCT username)
147 41
149 26
私はそれを返したい:
b.fkid COUNT(DISTINCT username)
147 41
148 0
149 26
さて、私は解決策を得ました。これは、rexem の回答の修正版です。
SELECT t.fkid,
IFNULL(nu.num_users, 0)
FROM TABLE_2 t
LEFT JOIN (SELECT t.fkid,
COUNT(DISTINCT t.username) 'num_users'
FROM TABLE_2 t
JOIN TABLE_1 a ON a.id = t.fkid
AND SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) < t.time
GROUP BY t.fkid) nu ON nu.fkid = t.fkid
WHERE t.fkid IN (147, 148, 149)
GROUP BY t.fkid, nu.num_users
Changes from rexem's answer:
"SEC_TO_TIME( 60*60 )) = t.time" to "SEC_TO_TIME( 60*60 )) < t.time"
Removed "t.time" in GROUP BY clause of subquery