【问题标题】:Optimizing mySQL query with almost identical subquery使用几乎相同的子查询优化 mySQL 查询
【发布时间】:2014-11-07 10:57:01
【问题描述】:

有没有办法优化下面的查询?

SELECT s1.* FROM
(SELECT s.* 
FROM answer a, answer_item ai, sessions s
WHERE s.session_state='FINISHED' AND a.sessionId=s.id AND ai.answer=a.id
AND a.question=1001 AND ai.question_variant_id=1103) s1, 
(SELECT s.* 
FROM answer a, answer_item ai, sessions s
WHERE s.session_state='FINISHED' AND a.sessionId=s.id AND ai.answer=a.id
AND a.question=1003 AND ai.question_variant_id=1301) s2
WHERE s1.id=s2.id 

除了这些部分之外,一切似乎都一样:

  1. a.question=1001 AND ai.question_variant_id=1103
  2. a.question=1003 AND ai.question_variant_id=1301

【问题讨论】:

    标签: mysql


    【解决方案1】:
    SELECT s.* 
    FROM answer a
    JOIN answer_item ai ON ai.answer=a.id
    JOIN sessions s ON a.sessionId=s.id
    WHERE s.session_state='FINISHED'
    AND 
    (
          a.question=1001 AND ai.question_variant_id=1103
       OR a.question=1003 AND ai.question_variant_id=1301
    )
    

    【讨论】:

    • 嗨,@juergen d!谢谢你的回答!不幸的是,优化的查询数据集不同。它包含 84 行,但原始查询数据集仅包含 30 行。
    【解决方案2】:

    这似乎是在寻找回答这两个问题的会话(或其他)。我认为以下内容可能会为您提供所需的行。但是,您可能需要做更多工作才能获得正确的列:

      SELECT s.* 
      FROM answer a JOIN
           answer_item ai
           ON ai.answer = a.id JOIN
           sessions s
           ON a.sessionId = s.id
      WHERE s.session_state = 'FINISHED' AND
            (a.question = 1001 AND ai.question_variant_id = 1103 OR
             a.question = 1003 AND ai.question_variant_id = 1101
            )
      GROUP BY s.id
      HAVING SUM(a.question = 1001 AND ai.question_variant_id = 1103) > 0 AND
             SUM(a.question = 1003 AND ai.question_variant_id = 1101) > 0
    

    【讨论】:

    • 嗨,@Gordon Linoff!谢谢你的回答!
    【解决方案3】:

    检查下面的优化查询。

    SELECT  s.* FROM  FROM answer a, answer_item ai, sessions s
    WHERE s.session_state='FINISHED' AND a.sessionId=s.id AND ai.answer=a.id
    AND ( 
       (a.question=1001 AND ai.question_variant_id=1103)
       OR 
       (a.question=1003 AND ai.question_variant_id=1301)
    )
    

    【讨论】:

      【解决方案4】:

      试试这个(JOINansweranswer_item 两次):

      SELECT s.* 
      FROM answer a
      JOIN answer_item ai ON ai.answer=a.id
      JOIN sessions s ON a.sessionId=s.id
      JOIN answer a2 ON s.id=a2.sessionId
      JOIN answer_item ai2 ON ai2.answer=a2.id
      WHERE s.session_state='FINISHED'
      AND ( (a.question=1001 AND ai.question_variant_id=1103)
      AND (a2.question=1003 AND ai2.question_variant_id=1301) )
      

      【讨论】:

      • 嗨,@Kleskowy!谢谢你的回答!如果在条件下将 'OR' 替换为 'AND' 就可以了。
      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多