1

最も一般的なケースでは、次のようなクエリがあります。

SELECT tutor_school.name, count(*), tutor_school.schoolid 

FROM tutor_school, tutor_attends, tutor_tutors_in 

WHERE 
tutor_school.schoolid = tutor_attends.schoolid and 
tutor_school.schoolid in ('1', '2', '3') and 
tutor_attends.userid=tutor_tutors_in.userid

group by tutor_school.schoolid LIMIT 0, 10

本質的に、私は欲しい:

学校の名前、その学校に通う生徒の数、任意の科目の家庭教師、Schoolid

私が実際に得ているのは

学校の名前、その学校の生徒が教えたすべての科目の合計、schoolid-つまり、生徒1の家庭教師が3科目、生徒2の家庭教師が5の場合、2を返す代わりに8を取得します。

問題は次のステートメントにあることに気づきました。

tutor_attends.userid=tutor_tutors_in.userid

これは、リモートテーブル内の特定の外部キーの存在をチェックするのではなく、そのキーの各インスタンスの結果を提供します。

私が理解しようとしているのは、キーが発生する回数ではなく、指定されたキーの存在だけに制限するようにバインドする方法です。私のSQLクラスでこれに似たケースを見たことは知っていますが、解決策が何であったかを思い出せません。

4

3 に答える 3

2

Andrewは正しく、これが彼の解決策の具体例です(テーブルの設計について仮定を立てる必要がありました)。

SQL> SELECT * FROM tutor_school;

  SCHOOLID NAME
---------- --------------------
         1 School A
         2 School B
         3 School C


SQL> SELECT * FROM tutor_attends;

    USERID   SCHOOLID
---------- ----------
         1          1
         2          1
         3          2


SQL> SELECT * FROM tutor_tutors_in;

    USERID SUBJECT
---------- --------------------
         1 Math
         1 Science
         1 English
         2 English
         3 Math


SQL> SELECT tutor_school.name, COUNT(DISTINCT tutor_tutors_in.userid)
  2  FROM tutor_school, tutor_attends, tutor_tutors_in
  3  WHERE tutor_school.schoolid=tutor_attends.schoolid
  4  AND tutor_attends.userid=tutor_tutors_in.userid
  5  GROUP BY tutor_school.name
  6  /

NAME                 COUNT(DISTINCTTUTOR_TUTORS_IN.USERID)
-------------------- -------------------------------------
School A                                                 2
School B                                                 1
于 2011-10-04T23:49:00.877 に答える
1

まず、JOINのANSI構文を学習する必要があります。句だけを使用するWHEREことは非推奨です。それはさておき、を使わなくても解決策を考えることができますEXISTS

SELECT tutor_school.name, count(DISTINCT tutor_attends.userid), tutor_school.schoolid 

FROM tutor_school, tutor_attends, tutor_tutors_in 

WHERE 
tutor_school.schoolid = tutor_attends.schoolid and 
tutor_school.schoolid in ('1', '2', '3') and 
tutor_attends.userid=tutor_tutors_in.userid

group by tutor_school.schoolid LIMIT 0, 10

私があなたのスキーマについて少し混乱しているのは、結合テーブルは表示されますが、古いtutorテーブルは表示されないことです。1つでクエリを概念化する方が簡単かもしれません。

于 2011-10-04T23:27:15.340 に答える
0

必要な関係演算子は(結合ではなく)半結合ですEXISTS要件の自然言語ステートメントから、使用するのが最も適切だと思います

例えば

SELECT tutor_school.name, count(*), tutor_school.schoolid 
FROM tutor_school, tutor_tutors_in 
WHERE 
tutor_school.schoolid = tutor_attends.schoolid and 
tutor_school.schoolid in ('1', '2', '3') and
exists (
        SELECT *
          FROM tutor_attends
         WHERE tutor_attends.userid = tutor_tutors_in.userid
       )
group by tutor_school.schoolid LIMIT 0, 10
于 2011-10-05T08:33:29.700 に答える