SQL从一个表中选择不在另一个表中的项

时间:2012-08-10 13:20:28

标签: php mysql sql codeigniter

我有一个带有变量$ lid的php页面和一个带有可变$ uid的用户......我需要从2个表中选择一些数据来填充页面。

        Table 1                          Table 2
¦----------¦----------¦    ¦----------¦----------¦----------¦
¦    qid   ¦    lid   ¦    ¦   owner  ¦   qid    ¦timestamp ¦
¦----------¦----------¦    ¦----------¦----------¦----------¦

我需要编写一个SQL语句,从表2中获取所有内容,其中owner = $ uid如果qid尚未在table1中列出,当前页面为'$ lid。

我试过

SELECT * FROM table_two WHERE qid != (SELECT qid FROM table_one WHERE lid = " . $lid .") AND owner = " . $uid . ";

但没有快乐

有什么想法吗?

6 个答案:

答案 0 :(得分:7)

这样可行:

SELECT * 
FROM table_two 
WHERE qid not in (
    SELECT qid 
    FROM table_one 
    WHERE lid = " . $lid .") 

这可能会表现得更好:

SELECT T2.* 
FROM table_two t2
LEFT OUTER JOIN table_one T1 ON T2.QID = T1.QID 
    AND T1.LID = " . $lid ."
WHERE T1.qid IS NULL

答案 1 :(得分:3)

您应该使用LEFT JOIN来获得最佳效果:

SELECT a.*
FROM table_two a
    LEFT JOIN table_one b
        ON a.qid = b.qid AND
           b.lid = " . $lid ."
WHERE b.qid IS NULL;

请参阅Visual Explanation Of Joins

答案 2 :(得分:1)

SELECT * FROM table_two WHERE qid NOT IN (SELECT qid FROM table_one WHERE lid = " . $lid .")

使用NOT IN子句。这会为您提供不在subquery中的ID。

修改 你也可以使用Left-Join,在MSSQL中效率较低,但这是MySQL(我没有注意到),所以它们运行相同。你可以看到它here

答案 3 :(得分:1)

SELECT * FROM table_two WHERE qid not in 
    (SELECT qid FROM table_one WHERE lid = " . $lid .")

答案 4 :(得分:0)

您建议使用:

SELECT * 
FROM table_two 
WHERE qid not in (
    SELECT qid 
    FROM table_one 
    WHERE lid = " . $lid .") 

我也有相同的prblm,但我替换机智“notin”它起作用了我

答案 5 :(得分:-1)

我会说使用

SELECT * FROM table_two WHERE NOT EXISTS (SELECT NULL FROM table_one WHERE lid = " . $lid .")

使用NOT EXISTS子句将为您提供比NOT IN更好的查询计划。