1

以下の相関サブクエリがあります。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
4

4 に答える 4

1

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 パラメーターを返します。

于 2009-09-13T20:23:26.170 に答える
1

試す:

   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
于 2009-09-13T20:26:07.550 に答える
0
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で機能するかどうかはわかりません。しかし、これを使用してクエリを作成するというアイデアが得られることを願っています。

于 2009-09-13T21:12:31.433 に答える