mysql子查询问题

时间:2011-03-02 02:03:54

标签: php mysql sql

我正在摸着MySQL子查询。而且只有在刮了几个小时之后我才会在SO中发布它。所以这就是:

$query_1 = "SELECT * 
              FROM table_new
             WHERE table_new.NAME NOT IN ('text I know does not exist') ";

$query_2 = "SELECT *
              FROM table_new, 
                   table_old
             WHERE table_new.NAME = table_old.NAME ";

$query_3 = "SELECT * 
              FROM table_new
             WHERE table_new.NAME NOT IN (SELECT * 
                                            FROM table_new, 
                                                 table_old
                                            WHERE table_new.NAME = table_old.NAME) ";

问题在于:
$ query_1和$ query_2工作。但是当我在$ query_3中组合它们时,它不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

使用:

SELECT * 
  FROM table_new
 WHERE table_new.NAME NOT IN (SELECT table_old.NAME
                                FROM table_old)

标准SQL只允许IN子句中的一列进行列比较 - 您不能在SELECT *子句中使用IN,因为不清楚在外部比较哪些列值查询。但是,根据我的知识,MySQL是唯一支持元组的。

还有其他方法可以编写查询以获得相同的结果:

SELECT x.* 
  FROM TABLE_NEW x
 WHERE NOT EXISTS (SELECT NULL
                     FROM TABLE_OLD x
                    WHERE y.NAME = x.NAME)

...或:

   SELECT x.* 
     FROM TABLE_NEW x
LEFT JOIN TABLE_OLD y ON y.NAME = x.NAME
    WHERE y.column_in_table_old IS NULL

哪些表现最佳取决于比较的列是否可以为空。 For more info, see this page