如何使用PHP/mySQL查询存在于一个表而不是另一个表中的条目?

如何使用PHP/mySQL查询存在于一个表而不是另一个表中的条目?,php,mysql,join,Php,Mysql,Join,我只想查询表2中包含课程值且课程在表1中不存在的条目。我最初根据课程值将表1与表2进行了内部连接。以下是迄今为止我所掌握的,但不起作用: $query = "SELECT value1,value2,value3 FROM table2 INNER JOIN table1 USING(course) WHERE table2.sem = '$semester' AND NOT EXISTS (SELECT course FROM table1)

我只想查询表2中包含课程值且课程在表1中不存在的条目。我最初根据课程值将表1与表2进行了内部连接。以下是迄今为止我所掌握的,但不起作用:

    $query = "SELECT value1,value2,value3 FROM table2 INNER JOIN table1 USING(course)
            WHERE table2.sem = '$semester' AND NOT EXISTS (SELECT course FROM table1)
            ORDER BY course";
    $result = mysql_query($query2) or die(mysql_error());

    while ($row2 = mysql_fetch_array($result))
    {
        print_r($row);echo "<br><br>";
    }
编辑:如果你想深入解释为什么要走这条路线,而不是走同样有效的左连接,请阅读本文:

编辑:如果你想深入解释为什么要走这条路线,而不是走同样有效的左连接,请阅读本文:


尝试从此_表中选择*,其中fk不在从外部_表中选择pk中。如果在表1上执行左联接,并且该条目在表1中不存在,则其数据将设置为NULL,因此,您可以检查table1。数据为空。请尝试从此_表中选择*,其中fk不在从外部_表中选择pk。如果您在table1上执行左联接,并且该条目在table1中不存在,则其数据将设置为空,因此,您可以检查table1.data是否为空。该解释对MySQL有效吗?+1用于指向优秀解释的链接。这很有启发性。@Vatev:在该系列文章中,对MySQL的行为有一个进一步的解释:总结:“LEFT JOIN”和“NOT in”同样快,但在MySQL中使用不同的查询计划。感谢@dnagirl,我如此专注于SQL Server,我忘记了经常存在有意义的差异。您可能希望将课程不为NULL的地方添加到表1中的子查询,以避免返回任何空值。。。没有保证table1.course不能为空。即使有这样的保证,我也总是把它包括在内,作为提醒,我永远不希望列表中出现空值,并与其他我没有这样保证的地方保持一致。这个解释对MySQL有效吗?+1是一个很好的解释链接。这很有启发性。@Vatev:在该系列文章中,对MySQL的行为有一个进一步的解释:总结:“LEFT JOIN”和“NOT in”同样快,但在MySQL中使用不同的查询计划。感谢@dnagirl,我如此专注于SQL Server,我忘记了经常存在有意义的差异。您可能希望将课程不为NULL的地方添加到表1中的子查询,以避免返回任何空值。。。没有保证table1.course不能为空。即使有这样的保证,我也总是把它包括在内,作为提醒,我永远不希望列表中出现空值,并且与其他我没有这样保证的地方保持一致。
    $query = "SELECT * FROM table1 INNER JOIN table2 USING(course) 
            WHERE table1.sem = '$semester'
            ORDER BY course";
    $result = mysql_query($query) or die(mysql_error());
$query = "SELECT value1,value2,value3 FROM table2 
            WHERE table2.sem = '$semester' AND course IS NOT NULL
            AND course NOT IN(SELECT course FROM table1)
            ORDER BY course";
SELECT value1,value2,value3 
FROM table2 t2
LEFT JOIN table1 t1 ON t2.course = t1.course
WHERE t1.course IS NULL
  AND t2.sem = '$semester'
ORDER BY course";