0

私はこれらのテーブルを持っています:

users
-----
id                  INT
name                VARCHAR(20)
email               VARCHAR(40)

user_fans
----------
id                  INT
user_id             INT  /* linked to users.id */
fan_id              INT  /* linked to users.id */
time_created        INT  /* unix timestamp */

次のクエリを使用してusers名前が付けられた追加のフィールドを持つテーブルからすべての行を取得できますnum_fans

SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans
FROM users u
LEFT JOIN user_fans f ON u.id=f.user_id
GROUP BY u.id, u.name, u.email
ORDER BY num_fans DESC

問題は、私がnum_fans時間の範囲内で取得する必要があるということです。このクエリを試しました

SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans
FROM users u
LEFT JOIN user_fans f ON u.id=f.user_id
WHERE f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00')
GROUP BY u.id, u.name, u.email
ORDER BY num_fans DESC

ただし、上記のクエリでは、すでにファンがいるユーザーのみが返されます。残りのユーザーもnum_fans=0で返されるようにします。

ご協力いただきありがとうございます。

4

2 に答える 2

2

条件をon:に移動します

SELECT u.id, 
       u.name, 
       u.email, 
       COUNT(f.id) AS num_fans 
FROM users u LEFT JOIN user_fans f 
             ON u.id=f.user_id 
             and f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00') 
GROUP BY u.id, u.name, u.email ORDER BY num_fans DESC 

更新
(@Gardon Daveの提案に関する説明を追加)

あなたが持っているものとこれの違いは次のとおりです。

クエリでは、WHERE句に条件があります。これは、結合後に適用されます(結合の上でのフィルタリングとしてこれを参照してください)。行がこの条件に従わない場合、その行は削除されます。テーブルにエントリがない外部結合行は、user_fansこの条件を満たしません(値はNULLになります)。

に条件があるonと、ユーザーテーブルはテーブルのサブセットにのみ結合さuser_fansれます。外部結合は、このフィルタリングの後に発生します。

于 2012-05-15T13:58:11.357 に答える
0

条件にnullを追加してみてください:

SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans  
FROM users u  
LEFT OUTER JOIN user_fans f ON u.id=f.user_id  
WHERE f.time_created is null or f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00')  
GROUP BY u.id, u.name, u.email  
ORDER BY num_fans DESC
于 2012-05-15T14:00:20.903 に答える