mysql multiple NOT在where条件基于另一个查询的结果

时间:2013-01-13 04:00:46

标签: mysql sql

我有一种情况,我需要从一个表中提取数据,但根据另一个表中的行排除某些行。我的意思是我需要从一个表中提取studentid(s),但不包括那些在另一个表中的那些studentntid(s)。

第一次查询:

$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";

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

3 个答案:

答案 0 :(得分: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_A中的所有学生信息,其中学生不在table_B中。

这里是通过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)

答案 1 :(得分: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')"

答案 2 :(得分:0)

我可以看到你已经接受了答案。但你也可以这样做。通过检查 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);