4

MySQLCOUNT()メソッドを使用して、2つのテーブルuidのu.idを持つ行の数を調べています。

そのために、私は以下の方法を使用しています。

SELECT u.id, u.first_name, u.last_name, u.email, u.username, COUNT( q.uid ) AS  `q_count`, COUNT( a.uid ) AS `a_count` 
FROM  `users` AS u
INNER JOIN `questions` AS q ON u.id = q.uid
INNER JOIN `answers` AS a ON u.id = a.uid
WHERE u.username =  'admin'

ただし、上記のクエリを実行すると、2番目のカウントは最初のカウントの行数と同じ行数を返します。questionsテーブルに2つの行があり、テーブルに1つの行がある場合、最初のカウントが2を返し、2番目のカウントも同じことをしているので、これを知っていanswersます。

どこが悪いのか教えていただけますか?

ありがとう


私が受け取っているもののサンプル:http://d.pr/i/vcnJ

サンプルデータanswershttp ://d.pr/i/TMkU

サンプルデータquestionshttp ://d.pr/i/tuwU

4

2 に答える 2

1

その理由は、結果を 1 つに結合する JOIN を実行しているためだと思います。同じクエリをSELECT *代わりに使用してください。これが発生する理由がわかります。

これを試して:

SELECT u.id, u.first_name, u.last_name, u.email, u.username, COUNT( DISTINCT q.id ) AS  `q_count`, COUNT( DISTINCT a.id ) AS `a_count` 
FROM  `users` AS u
INNER JOIN `questions` AS q ON u.id = q.uid
INNER JOIN `answers` AS a ON u.id = a.uid
WHERE u.username =  'admin'
于 2012-04-29T14:38:42.190 に答える
0

1 つのクエリで 2 つのテーブルをカウントすることはできません。COUNT()特定の値ではなく、行をカウントします。

ただし、できることは

SELECT u.id, u.first_name, u.last_name, u.email, u.username, 
SUM( CASE WHEN q.uid IS NULL THEN 0 ELSE 1 END ) AS  `q_count`, 
SUM( CASE WHEN a.uid IS NULL THEN 0 ELSE 1 END ) AS `a_count` 
FROM  `users` AS u
LEFT JOIN `questions` AS q ON u.id = q.uid
LEFT JOIN `answers` AS a ON u.id = a.uid
WHERE u.username =  'admin'
于 2012-04-29T14:38:14.800 に答える