繁体   English   中英

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

[英]SQL select item from one table that is not in another

我有一个带有变量$ 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 . ";

但没有快乐

有任何想法吗?

这可行:

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

您应该使用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;

请参见连接的可视化解释

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

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

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

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

你建议使用:

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

我也有相同的prblm,但我替换机智“notin”它工作对我来说

我会说用

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM