2012-08-10 92 views
3

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

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

我需要编写会从表2的一切这里的主人= $ UID如果QID尚未在表1与当前页面$盖中列出的SQL语句。

我试图

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

但没有喜悦

任何想法?

+0

如果你担心性能,你需要看看针对提出的不同查询的查询计划和/或测量响应时间。很多可能取决于Table_One中与Table_Two中的行匹配的行数。 – 2012-08-10 13:30:32

回答

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
SELECT * FROM table_two WHERE qid NOT IN (SELECT qid FROM table_one WHERE lid = " . $lid .") 

使用NOT IN条款。这会给你的ID不在你的subquery

编辑 你也可以使用Left-Join,在MSSQL是efficcient少,但这是MySQL(我没有注意到),所以他们同样运行。你可以看到它here

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

您应该使用LEFT JOIN最佳perofrmance:

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

+0

这是来自4个答案的最有效的查询。 +1 – Fluffeh 2012-08-10 13:23:26

+1

不,不是。 http://blog.sqlauthority.com/2008/04/22/sql-server-better-performance-left-join-or-not-in/ – 2012-08-10 13:24:09

+0

谢谢!我想我们正在谈论MySQL服务器。我认为在大多数情况下,'LEFT JOIN'比'sub-query'执行得更好。无论如何,对每个查询使用'EXPLAIN'总是最佳实践。 – Omesh 2012-08-10 13:31:34

-1

我会说使用

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

使用NOT EXISTS子句将给你一个比NOT IN更好的查询计划。

+0

这可能是错误的。考虑到他正在返回一个不同的值,以至于在其他地方使用 – 2012-08-10 13:36:19

+0

另外,考虑到它的好处,效率会比另外4个选项低http://explainextended.com/2009/09/18/not-in-vs-not-存在-VS-左联接,是无效的MySQL / – 2012-08-10 13:40:14

0

您建议使用:

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

我也得到了同样的prblm但在IM取代才子“notin”它的工作原理FR我

相关问题