相関サブクエリに一致しない行を含めるSQLステートメント
質問
以下に相関サブクエリがあります。 table1の各ID(147,148,149)には、table2に多くのレコードがあります。ただし、ID 148には、ステートメントの時間条件に一致するレコードがありません。したがって、出力には含まれません。 count列に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
解決
試してください:
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
他のヒント
COALESCEを使用して、空のセットと時間を比較するシナリオを処理してみてください(たとえば、table1とtable2の間に一致がないため):
SELECT b.fkid, COUNT(DISTINCT username)
FROM table2 AS b
WHEREb.fkid IN ( 147,148,149 )
AND time > COALESCE((SELECT SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) FROM table1 AS a WHERE a.id = b.fkid), 0)
GROUP BY b.fkid
COALESCEは無制限のパラメーターセットを受け取り、このグループから、最初の非NULLパラメーターを返します。
SELECT a.ID, COUNT(DISTINCT username)
FROM table1 AS a LEFT JOIN table2 AS b
on a.ID = b.fkID
WHERE a.ID IN ( 147,148,149 )
AND b.time > SUBTIME(a.endTime, SEC_TO_TIME( 60*60 ))
GROUP BY a.ID
とにかくこれは役立ちますか?
編集:これがmysqlで機能するかどうかわかりません。しかし、これを使用してクエリを作成するアイデアが得られることを願っています。
結果にゼロを入れる最良の機会は、(ばらばらの)UNIONを使用することだと思います。最初の部分は現在のクエリです。 2番目の句は、関連するエントリがない値を検索し、count列に定数0を選択します。
多くの場合、外部結合がトリックを行います。ここでの難点は、外部結合がID = 148のデータ行を生成するため、COUNTが0ではなく1の答えを返すことです。
所属していません StackOverflow