0

我有一种情况,我需要从一个表中提取数据,但根据另一个表中的行排除一些行。我的意思是我需要从一个表中提取学生 ID,但排除另一个表中的学生 ID。

第一个查询:

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

因为我将从这个查询中得到一个数组结果,所以我想使用这个结果并将它放在下一个查询中的 NOT 条件中,只需从另一个查询的结果中排除这些行。

第二个查询:

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

基本上,在根据第二个查询拉出学生时,不需要第一个表中的学生。如果我使用了错误的逻辑,请指导以实现这一目标。

4

3 回答 3

3

您至少可以通过 3 种方式来实现总体思路,使用 LEFT JOIN,以及使用 NOT IN 和 NOT EXISTS。

通过左连接。

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_A 中的所有学生信息,其中学生不在 table_B 中。

这里是通过不存在:

 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

您的意思是第二个查询使用第一个查询作为 NOT 条件吗?

"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 回答
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 回答