2012-01-12 261 views
2

我正試圖學習PHP和MySQL中的多個SQL查詢的最佳實踐。不知道我是否應該有兩個單獨的查詢,或者如果我應該加入(或聯合?)我的查詢到一個。多個SELECT查詢和循環遍歷PHP和mySQL結果

我可以做以下事情還是有另一種方式來完成同樣的事情?

請務必注意,我的第一個查詢是提取問題和答案的測驗列表。第二個查詢是拉取我將用於根據測驗分數分配給用戶的分數配置文件列表。這兩個表之間的唯一關係是兩者都使用與我的「測驗」表中鏈接到ID的相同外鍵。我不需要並排連接這些表,但我想我可能需要將它們聯合起來,這樣我的第二個查詢結果纔會出現在第一個查詢結果之後。

現在,如果我應該將我的查詢合併爲一個,我不知道如何循環查詢結果來創建我的數組。當我遍歷每個結果時,我會需要一些條件邏輯來處理我的第一個查詢結果,而另一些查詢結果則與我的第二個查詢結果不同。我會如何寫這些條件?

這是我現在正在做的,這似乎是兩個單獨的查詢工作的罰款...

......在數據庫中查詢第一時間讓我的問答題和答案:

$result_quiz = mysql_query(" 
    SELECT quiz_question.question_text, quiz_question.id, quiz_answer.answer_text, quiz_answer.points 
    FROM quiz 
    JOIN quiz_question ON (quiz.id = quiz_question.quiz_id) 
    JOIN quiz_answer ON (quiz_question.id = quiz_answer.quiz_question_id) 
    WHERE quiz.id = $id; 
"); 

......然後根據上面的查詢,建立我的問題和答案數組:

$quiz = array(); 
while ($row = mysql_fetch_assoc($result_quiz)) { 
    if (!isset($quiz['questions']['q'.$row['id'].''])) { 
     $quiz['questions']['q'.$row['id'].''] = array(
      'question' => $row['question_text'], 
      'answers' => array() 
     ); 
    } 
    $quiz['questions']['q'.$row['id'].'']['answers'][] = array('answer' => $row['answer_text'],'points' => $row['points']); 
} 

......然後查詢數據庫的第二次拿到得分配置文件的列表:

$result_profile = mysql_query(" 
    SELECT quiz_profile.name, quiz_profile.description, quiz_profile.min_points, quiz_profile.max_points 
    FROM quiz 
    JOIN quiz_profile ON (quiz.id = quiz_profile.quiz_id) 
    WHERE quiz.id = $id; 
"); 

......然後通過我的第二個查詢循環,所以我可以追加分數型材我數組:

while ($row = mysql_fetch_assoc($result_profile)) { 
    $quiz['profiles'][] = array('name' => $row['name'],'description' => $row['description'],'min_points' => $row['min_points'],'max_points' => $row['max_points']); 
} 

這是最好的方法?

或者我應該將我的查詢合併爲一個使用UNION?

如果是這樣,我該如何寫我的條件來知道我循環的結果?

非常感謝!

回答

1

我建議堅持使用目前的方法,除非性能存在嚴重問題 - 將兩個查詢結合起來可能會提高總吞吐量(稍微),但會顯着增加顯示它所需的代碼的複雜性。

1

我建議退一步看看你的應用程序的設計,而不是代碼本身:如果你走下UNION之路,你必須犧牲你的問題代碼和你的scoreprofiles代碼之間的所有隔離。

我說,這不是一件好事:如果有一天比分配置文件以某種方式在數據庫和用戶之間重新計算或變形?是否直觀,爲此你必須觸摸從db獲取問題的功能?

在PHP中,有一條經驗法則(根據所有經驗法則)並非100%完美,而是一個開始:應該有可能將與一個功能字段有關的所有代碼定位在一個文件,include s和require鏡像依賴關係。