2012-07-30 67 views
0

我无法弄清楚如何合并这两个查询并一次得到结果。如何合并2个sql语句并立刻获得结果

 $q1 = "SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
      FROM questions_and_exercises q, `lesson-question` lq 
      LEFT JOIN answers a ON (a.uid=? AND a.qid=lq.qid) 
      LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
      WHERE q.id=lq.qid AND lq.lid=?"; 
     $q2 ="SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
      FROM questions_and_exercises q, 
      `questions from-to` qft 
      LEFT JOIN answers a ON (a.uid=? AND a.qid=qft.qid) 
      LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
      WHERE q.id=qft.qid AND qft.to_uid=?"; 

推荐?在此先感谢

+0

使用['UNION'(http://dev.mysql.com/doc/refman/5.5/en/union.html),卢克 – Nemoden 2012-07-30 06:50:54

回答

1

使用UNION这个问题。

然而,在这种情况下,我不认为甚至需要一个UNION

$q1 = "SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
     FROM questions_and_exercises q, `lesson-question` lq 
     LEFT JOIN answers a 
     ON a.qid=lq.qid 
     LEFT JOIN `answer_chk_results` acr 
     ON acr.aid=a.id 
     WHERE q.id=lq.qid AND a.uid = ? (lq.lid = ? OR qtf.to_uid = a.uid)"; 

将这些结果2扣杀连成多行。

$q1 = "SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
     FROM questions_and_exercises q, `lesson-question` lq 
     LEFT JOIN answers a ON (a.uid=? AND a.qid=lq.qid) 
     LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
     WHERE q.id=lq.qid AND lq.lid=? 
     UNION # ALL 
     SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
     FROM questions_and_exercises q, 
     `questions from-to` qft 
     LEFT JOIN answers a ON (a.uid=? AND a.qid=qft.qid) 
     LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
     WHERE q.id=qft.qid AND qft.to_uid=?"; 

要么使用UNIONUNION ALL取决于您是否要合并相同的行或不上。 UNION要求两个SELECT具有相同数量的列,并将使用第一个SELECT的别名。

可能宜生像这最后询问:

 SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
     FROM questions_and_exercises q, 
     `questions from-to` qft 
     LEFT JOIN answers a 
     ON a.qid=qft.qid 
     LEFT JOIN `answer_chk_results` acr 
     ON acr.aid=a.id 
     WHERE q.id=qft.qid AND qft.to_uid=? AND qtf.to_uid = a.uid 

Basicly,因为它是相同的值,它足以与?比较to_uid,然后用uid比较to_uid。这与通过ON比较它们的结果是一样的。

+0

嘿,你能告诉我'ALL'用于''之前的是什么? – 2012-07-30 06:52:49

+0

qft.to_uid =?中的第二个查询和a.uid =? '?'是同一个id。我如何优化这个查询来发送'to_uid'和'a.uid'的bir参数? – heron 2012-07-30 06:53:39

+0

@epic_syntax简单地解析这个值两次对于MySQL查询来说已经足够优化了。 @先生。外星人这只是一个评论,我曾经证明你可以有或在'UNION'中跳过'ALL'。 – 2012-07-30 06:55:35

0

使用UNION ALL

$q1 = "SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
      FROM questions_and_exercises q, `lesson-question` lq 
      LEFT JOIN answers a ON (a.uid=? AND a.qid=lq.qid) 
      LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
      WHERE q.id=lq.qid AND lq.lid=? union all 
      SELECT q.id, q.content, a.id, a.content, a.addDT, acr.score 
      FROM questions_and_exercises q, 
      `questions from-to` qft 
      LEFT JOIN answers a ON (a.uid=? AND a.qid=qft.qid) 
      LEFT JOIN `answer_chk_results` acr ON (acr.aid=a.id) 
      WHERE q.id=qft.qid AND qft.to_uid=?"; 
+0

第二个查询在qft.to_uid =?和a.uid =? '?'是同一个id。我如何优化这个查询来发送'to_uid'和'a.uid'的bir参数? – heron 2012-07-30 06:53:11