0

あるテーブルからデータを取得する必要があるが、別のテーブルの行に基づいていくつかの行を除外する必要がある状況があります。つまり、あるテーブルから学生IDを取得する必要がありますが、別のテーブルにある学生IDを除外する必要があります。

最初のクエリ:

$sql = "select studentid from table 2 where iarsid = '12'";

このクエリから配列結果を取得するので、この結果を使用して、次のクエリの NOT 条件に入れたいだけです。この別のクエリの結果からこれらの行を除外するだけです。

2 番目のクエリ:

$sql2 = "select studentid from table 2, table 3 where iarsid = '12' // and a lot of joins";

基本的に、最初のテーブルにある学生は、2 番目のクエリに基づいて学生を抽出する際には必要ありません。間違ったロジックを使用している場合は、これを達成するようにガイドしてください。

4

3 に答える 3

3

LEFT JOIN を使用し、NOT IN と NOT EXISTS を使用して、少なくとも 3 つの方法で一般的なアイデアを実行できます。

LEFT JOINS経由。

SELECT student_name
FROM table_A a
LEFT JOIN table_B b ON a.student_id = b.student_id
WHERE b.student_id IS NULL

これにより、生徒が table_B に含まれていない table_A のすべての生徒情報が取得されます。

ここでは NOT EXISTS 経由です。

 SELECT student_name
 FROM table_A a
 WHERE NOT EXISTS (SELECT student_id FROM table_B b WHERE b.student_id = a.student_id)

そしてNOT IN経由

 SELECT student_name
 FROM table_A a
 WHERE a.student_id NOT IN (SELECT student_id FROM table_B b)
于 2013-01-13T04:05:41.600 に答える
1

あなたが答えを受け入れたことがわかります。しかし、これを行うこともできます。プランを確認することで、どのクエリが高速かを確認するための最良の方法。Explain

 SELECT student_name
 FROM table_A a
 WHERE a.student_id NOT EXISTS (SELECT student_id FROM table_B b)

これは、を使用した非相関クエリexistsであるため、テーブルが大きいほど大きくなります。そしてIN、小さなテーブルの方が速くなります。一致するものが見つからなかった瞬間に高速になる理由は、代わりにfalseを返し、IN全表スキャンを実行します。

これも:

 SELECT student_name
 FROM table_A a
 WHERE NOT EXISTS (SELECT null 
                   FROM table_B b
                   WHERE a.studentid = b.studentid);
于 2013-01-13T04:34:03.747 に答える
1

最初のクエリを NOT で条件として使用する 2 番目のクエリを意味しますか?

"select studentid from table 2, table 3 where iarsid = '12' // and a lot of joins"
+ " WHERE studentid NOT IN (select studentid from table 2 where iarsid = '12')"
于 2013-01-13T04:07:10.200 に答える