2013-02-26 59 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版本可能没问题。