2013-02-26 44 views
4

加入我有以下查詢:與更換子查詢在MySQL

SELECT PKID, QuestionText, Type 
FROM Questions 
WHERE PKID IN (
    SELECT FirstQuestion 
    FROM Batch 
    WHERE BatchNumber IN (
     SELECT BatchNumber 
     FROM User 
     WHERE RandomString = '$key' 
    ) 
) 

我聽說,子查詢效率低下以及連接是首選。然而,我無法找到任何解釋如何轉換3層以上子查詢來加入記譜法的任何內容,也無法讓我的頭轉向它。

任何人都可以解釋如何做到這一點?

+1

好吧,如果你張貼你的表格結構將是好的 – 2013-02-26 14:17:21

回答

3
SELECT DISTINCT a.* 
FROM Questions a 
     INNER JOIN Batch b 
      ON a.PKID = b.FirstQuestion 
     INNER JOIN User c 
      ON b.BatchNumber = c.BatchNumber 
WHERE c.RandomString = '$key' 

爲什麼指定DISTINCT的原因是,因爲有可能是在複製造成的結果記錄其他表匹配多行的行。但由於您只對表Questions上的記錄感興趣,因此DISTINCT關鍵字就足夠了。

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

+1

謝謝JW。這已經成功了。我只是說我將'a。*'換成了'a.PKID,a.QuestionText,a.Type' :) – 2013-02-26 14:32:01

+0

不客氣':D' – 2013-02-26 14:33:37

0

嘗試:

SELECT q.PKID, q.QuestionText, q.Type 
FROM Questions q 
INNER JOIN Batch b ON q.PKID = b.FirstQuestion 
INNER JOIN User u ON u.BatchNumber = q.BatchNumber 
WHERE u.RandomString = '$key' 
0
select 
    q.pkid, 
    q.questiontext, 
    q.type 
from user u 
join batch b 
    on u.batchnumber = b.batchnumber 
join questions q 
    on b.firstquestion = q.pkid 
where u.randomstring = '$key' 

因爲在你的WHERE條款過濾器USER表,啓動wi在FROM條款中。接下來,向後應用您的連接。

0

爲了正確執行此操作,您需要在子查詢中使用distinct。否則,可能會在版本一起乘行:

SELECT q.PKID, q.QuestionText, q.Type 
FROM Questions q join 
    (select distinct FirstQuestion 
     from Batch b join user u 
      on b.batchnumber = u.batchnumber and 
       u.RandomString = '$key' 
    ) fq 
    on q.pkid = fq.FirstQuestion 

至於injoin版本是否是更好的。 。 。那要看。在某些情況下,特別是如果字段被索引的話,in版本可能沒問題。