用MySQL中的连接替换子查询

时间:2013-02-26 14:10:27

标签: mysql sql join subquery

我有以下查询:

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

我听说子查询效率低下,并且首选联接。我找不到任何解释如何将3+层子查询转换为连接符号的内容,但是,无法理解它。

任何人都可以解释怎么做吗?

4 个答案:

答案 0 :(得分:5)

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 :(得分: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'

答案 2 :(得分: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表上过滤,请从FROM子句中的那个开始。接下来,向后应用您的联接。

答案 3 :(得分: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版本可能没问题。