質問

以下に相関サブクエリがあります。 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の答えを返すことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top