我有一种情况,我需要从一个表中提取数据,但根据另一个表中的行排除某些行。我的意思是我需要从一个表中提取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";
基本上,根据第二个查询拉出学生时,不需要第一个表中的学生。 如果我使用错误的逻辑,请指导以实现此目的。
答案 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);