2017-01-17 8 views
-1

私は質問に問題があります。SQL COUNT返品番号が間違っている

コース:

この表のuser_idコースの講師である私は、2つのテーブルを持っています。

----------------------------------------------------------------------- 
| course_id | user_id | course_name  | other information | 
----------------------------------------------------------------------- 
| 6   |  1  | My Course 1  | ...    | 
----------------------------------------------------------------------- 

my_courses:

この表のuser_idはもちろんの学生です。

-------------------------------------------------- 
| user_id  | course_id | created_at   | 
-------------------------------------------------- 
| 5   | 6   | [UNIX_TIMESTAMP] | 
-------------------------------------------------- 

はそのコースに参加している人の数が含まれています。私はすべてのコース情報と、コースに参加した人の数を取得したい。コースに参加した人の数を除き、すべてが期待どおりに戻ります。

 SELECT 
      courses.*, 
      users.name, //This is the name of the instructor 
      users.last_name, //This is the last name of the instructor 
      COUNT(my_courses.user_id) as count_students 

     FROM courses 

     LEFT JOIN users 
     ON courses.user_id = courses.user_id 

     LEFT JOIN my_courses 
     ON courses.course_id = my_courses.course_id 

     WHERE courses.course_id = '6' 

は、私が言ったように、このクエリは、通常のようにコースの情報を返しますが、それだけで1を返すべきときcount_studentsとして3を返します。これは、私が使用しているクエリです。誰がなぜこれが起こっているのか知っていますか?どんな助けでも大歓迎です。

+0

正しいRDBMSにタグを付けてください。正しいカウントを得るには 'GROUP BY'節が必要です。 –

+0

多分、返された行をカウントしています。具体的には 'my_courses'テーブルからではありません – MikeVelazco

+0

あなたのサンプルデータは質問に役立ちません。 –

答えて

1

おそらくJOINの条件がusersであるためです。それは次のようになります。また、あなたのクエリでGROUP BY句を追加する必要があり

LEFT JOIN users 
     ON courses.user_id = users.user_id 

SELECT 
    c.*, 
    u.name, 
    u.last_name, 
    COUNT(mc.user_id) AS count_students 
FROM courses c 
LEFT JOIN users u 
    ON c.user_id = u.user_id 
LEFT JOIN my_courses mc 
    ON c.course_id = mc.course_id 
WHERE c.course_id = '6' 
GROUP BY 
    <columns not in the aggregate function> 

また、エイリアスはあなたのテーブルには、読みやすさを向上させることができます。

+0

ええ、それは私がちょうど気づいたものです。私はそれを試してみましょう。 –

+1

それはこのタイプミスでした。そして提案のおかげで、私はそれを念頭に置いておきます。再度、感謝します! :) –

+1

私はできるだけ早くこの答えを受け入れるでしょう。 –

1

JOIN演算は、行のコンビナトリアル乗算を引き起こします。あなたはそれ自身のテーブルから学生数を要約する必要があります。

     SELECT course_id, COUNT(*) students 
         FROM my_courses 
        GROUP BY course_id 

これにより、course_idごとに1行または0行の結果セットが得られます。その後、それを残りのクエリに参加させることができます。

SELECT courses.*, 
     users.name, //This is the name of the instructor 
     users.last_name, //This is the last name of the instructor 
     aggr.count_students 
    FROM courses 
    LEFT JOIN users ON courses.user_id = courses.user_id 
    LEFT JOIN (
       SELECT course_id, COUNT(*) students 
        FROM my_courses 
       GROUP BY course_id 
     ) aggr ON courses.course_id = aggr.course_id 
WHERE courses.course_id = '6' 

あなたはおそらく、複数のインストラクター、とのコースに学生を複数カウント避けましょうその方法。