1

has-many-relation で結果をフィルタリングする方法についてはかなり良い記事があります: How to filter SQL results in a has-many-through relationship

COUNT 結果の解決策を探しているだけで、すべてを表示するわけではありません。

student {
    id
    name
}
club {
    id
    name
}
student_club {
    student_id
    club_id
}

CLUB1 と CLUB2 の両方に何人の生徒がいますか?

編集:以下のリンクから「Martin 2」メソッド を使用するとよいでしょう:

SELECT s.stud_id, s.name
FROM   student s
JOIN   student_club sc USING (stud_id)
WHERE  sc.club_id IN (30, 50)
GROUP  BY 1,2
HAVING COUNT(*) > 1;

COUNT の結果に何かを追加するだけです。

4

2 に答える 2

2

たった 2 人の学生にとって、おそらく最も単純で、最もクリーンで、最速です。

SELECT count(*) AS ct
FROM   student_club x
JOIN   student_club y USING (stud_id)
WHERE  x.club_id = 30
AND    y.club_id = 50;

このためにテーブルに参加する必要はまったくありません-興味studentのあるリストがわかればすぐに.stud_id

学生数に関係なく、Martin のクエリの方が便利です。同様の方法で単純化できます。

SELECT count(*) AS ct
FROM (
   SELECT stud_id
   FROM   student_club
   WHERE  club_id IN (30, 50)
   GROUP  BY 1
   HAVING count(*) = 2 -- adapt to number of items in list
   ) x;

もちろん一意である必要が(stud_id, club_id)あり、リスト項目も一意である必要があります。

于 2013-03-13T14:44:20.870 に答える
0

student_clubクエリは、テーブルおよびのテーブル エイリアスを使用しますclub。これにより、両方のクラブに所属する学生の行のみを返すことができます。次に、allows をCOUNT使用して学生の数を返します。

SELECT COUNT(*) AS nb
FROM student s, student_club sc1, club c1, student_club sc2, club c2
WHERE s.id=sc1.student_id AND sc1.club_id=c1.id AND c1.name="CLUB1"
AND s.id=sc2.student_id AND sc2.club_id=c2.id AND c2.name="CLUB2"

「Martin 2」クエリを本当に使用したい場合は、次の方法でレコード数を数えることができます。

SELECT COUNT(*) AS nb
FROM (
    SELECT s.stud_id, s.name
    FROM   student s
    JOIN   student_club sc USING (stud_id)
    WHERE  sc.club_id IN (30, 50)
    GROUP  BY 1,2
    HAVING COUNT(*) > 1
) tmp;
于 2013-03-13T10:59:04.303 に答える