[英]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.