2013-02-06 185 views
0

我有2个表与一对多索引相关。这是我第一次在这种情况下,我试图找出一个很好的智能查询来检索数据。查询Mysql上的相关表格

表名称:问题

结构

id poll_id question 

表名称:回答

结构

id question_id answer 

question_id从表anwsersID问题表forehing关键。

我需要检索所有问题(以及相应的答案选项)给出poll_id。到目前为止,我有这个查询:

'SELECT * FROM polls_questions pq, polls_answers WHERE `poll_id` = ' . $pid 

但是返回的数组是可怕的低效率,惠特数据重复多次。

对于4个问题的投票我得到35个元素;

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 1 domanda 1 
     ) 

    [1] => Array 
     (
      [id] => 1 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 1 domanda 1 
     ) 

    [2] => Array 
     (
      [id] => 1 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 1 domanda 1 
     ) 

    [3] => Array 
     (
      [id] => 1 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 1 domanda 1 
     ) 

    [4] => Array 
     (
      [id] => 2 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 2 domanda 1 (F: Domanda 3) 
     ) 

    [5] => Array 
     (
      [id] => 2 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 2 domanda 1 (F: Domanda 3) 
     ) 

    [6] => Array 
     (
      [id] => 2 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 2 domanda 1 (F: Domanda 3) 
     ) 

    [7] => Array 
     (
      [id] => 2 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 1 
      [answer] => Risposta 2 domanda 1 (F: Domanda 3) 
     ) 

    [8] => Array 
     (
      [id] => 3 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 1 domanda 2 
     ) 

    [9] => Array 
     (
      [id] => 3 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 1 domanda 2 
     ) 

    [10] => Array 
     (
      [id] => 3 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 1 domanda 2 
     ) 

    [11] => Array 
     (
      [id] => 3 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 1 domanda 2 
     ) 

    [12] => Array 
     (
      [id] => 4 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 2 domanda 2 
     ) 

    [13] => Array 
     (
      [id] => 4 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 2 domanda 2 
     ) 

    [14] => Array 
     (
      [id] => 4 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 2 domanda 2 
     ) 

    [15] => Array 
     (
      [id] => 4 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 2 
      [answer] => Risposta 2 domanda 2 
     ) 

    [16] => Array 
     (
      [id] => 5 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 1 domanda 3 
     ) 

    [17] => Array 
     (
      [id] => 5 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 1 domanda 3 
     ) 

    [18] => Array 
     (
      [id] => 5 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 1 domanda 3 
     ) 

    [19] => Array 
     (
      [id] => 5 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 1 domanda 3 
     ) 

    [20] => Array 
     (
      [id] => 6 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 2 domanda 3 (F: END POLL) 
     ) 

    [21] => Array 
     (
      [id] => 6 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 2 domanda 3 (F: END POLL) 
     ) 

    [22] => Array 
     (
      [id] => 6 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 2 domanda 3 (F: END POLL) 
     ) 

    [23] => Array 
     (
      [id] => 6 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 3 
      [answer] => Risposta 2 domanda 3 (F: END POLL) 
     ) 

    [24] => Array 
     (
      [id] => 7 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 1 domanda 4 
     ) 

    [25] => Array 
     (
      [id] => 7 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 1 domanda 4 
     ) 

    [26] => Array 
     (
      [id] => 7 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 1 domanda 4 
     ) 

    [27] => Array 
     (
      [id] => 7 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 1 domanda 4 
     ) 

    [28] => Array 
     (
      [id] => 8 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 2 domanda 4 
     ) 

    [29] => Array 
     (
      [id] => 8 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 2 domanda 4 
     ) 

    [30] => Array 
     (
      [id] => 8 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 2 domanda 4 
     ) 

    [31] => Array 
     (
      [id] => 8 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 2 domanda 4 
     ) 

    [32] => Array 
     (
      [id] => 9 
      [poll_id] => 1 
      [question] => Domanda 1 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 3 domanda 4 
     ) 

    [33] => Array 
     (
      [id] => 9 
      [poll_id] => 1 
      [question] => Domanda 2 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 3 domanda 4 
     ) 

    [34] => Array 
     (
      [id] => 9 
      [poll_id] => 1 
      [question] => Domanda 3 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 3 domanda 4 
     ) 

    [35] => Array 
     (
      [id] => 9 
      [poll_id] => 1 
      [question] => Domanda 4 
      [atype] => 0 
      [question_id] => 4 
      [answer] => Risposta 3 domanda 4 
     ) 

) 

我可以解决这个只用两个查询,一个问题,一个是答案,这会给我两个数组,但这样做没有一点对表之间的关系。我如何查询数据库并以最佳方式检索问题和答案?

回答

0

你不能在任何列,所以你得到一个笛卡尔结果集连接表:

'SELECT * 
FROM polls_questions pq 
INNER JOIN polls_answers pa 
    on pq.id = pa.question_id 
WHERE `poll_id` = ' . $pid 

您应该使用JOIN语法,在那里你连接表上的问题编号。这是确保你只会回答与答案的问题。否则,您将回答每个问题与每个答案。

我在两个表之间使用了一个INNER JOIN,它将返回两个表之间的匹配行。如果您想回答所有问题,即使答案中没有匹配的行,那么您也需要一个LEFT JOIN

如果您需要帮助了解连接语法,这里是一个伟大的visual explanation of joins

0
'SELECT * 
FROM polls_questions pq, polls_answers 
WHERE `poll_id` = ' . $pid . ' AND pq.id = polls_answers.question_id'