2012-08-10 93 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我

相關問題