4

データベースに 3 つのテーブルがあります。以下の構造を参照してください。

ユーザー

uid | fname | date_joined
---------------------------------
 1  | john  | 2013-08-25 01:00:00
 2  | rock  | 2013-08-26 01:00:00
 3  | jane  | 2013-08-27 01:00:00

質問

qid | uid 
---------- 
 1  |  1   
 2  |  1   
 3  |  2   
 4  |  3   
 5  |  3   
 6  |  1   
 7  |  1   
 8  |  2   
 9  |  2   

フォロワー

fid | qid
---------
 1  |  2
 2  |  1
 3  |  2
 4  |  1
 5  |  2
 6  |  3
 7  |  2

user テーブルには、すべてのユーザー関連フィールドが
含まれます question テーブルには、外部キー uid を持つすべての質問関連データが含まれます
フォロワー テーブルには、質問が何回フォローされたかの情報が格納されます

クエリに返してもらいたいのは次のとおりです。

unique uid, 
fname
question count for each user
follower count for each user

クエリを作成しましたが、正常に動作し、必要に応じてレコードを返しますが、フォロワー数は常に 0 です。これが私のクエリです。

SELECT 
    u.uid, u.fname, u.date_joined , 
    (SELECT COUNT(*) FROM questions WHERE questions.uid = u.uid) AS question_count,
    (SELECT COUNT(*) FROM followers WHERE followers.qid IN ( 
        SELECT GROUP_CONCAT(qid) FROM questions WHERE questions.uid = u.uid 
        ) 
    ) AS follow_count
FROM epc_user AS u
ORDER BY follow_count DESC, question_count DESC, date_joined DESC

いくつかの異なる組み合わせを試しましたが、どれもうまくいきませんでした。間違ったクエリを書いているか、別のサブクエリでサブクエリを使用できない可能性があります。可能かどうか、可能であれば知りたいだけです

4

2 に答える 2

3

GROUP_CONCAT文字列を返しますが、IN演算子は文字列ではなく一連の値で機能するため、次のようなものを使用する必要があります

   SELECT 
        u.uid, u.fname, u.date_joined , 
        (SELECT COUNT(*) FROM questions WHERE questions.uid = u.uid) AS question_count,
        (SELECT COUNT(*) FROM followers WHERE followers.qid IN ( 
            SELECT qid FROM questions WHERE questions.uid = u.uid 
            ) 
        ) AS follow_count
    FROM users AS u
    ORDER BY follow_count DESC, question_count DESC, date_joined DESC

フィドル: http://sqlfiddle.com/#!2/8cd10/2

于 2013-08-31T09:28:25.530 に答える
2

結合を使用して結果を取得できます。サブクエリは必要ありません:

select 
  u.uid, 
  u.fname, 
  u.date_joined, 
  count( distinct q.qid ) as 'question_count', 
  count( distinct f.fid ) as 'follower_count'
from users u
  left join questions q on q.uid = u.uid
  left join followers f on f.qid = q.qid
group by u.uid, u.fname, u.date_joined
order by follower_count desc, question_count desc, date_joined desc;
于 2013-08-31T09:33:48.020 に答える