2016-09-21 44 views
0

我有問題如何使查詢連接3個表中的記錄並在屏幕上顯示結果。我提出瞭解決方案,但對速度不利,我一直在尋求更好的解決方案。我的表是:如何顯示沒有foreach的三個表中的記錄

測試表

id_test 
testName 

問題表

id_quest 
id_test 
question 

回答表

id_answer 
id_quest 
answer 

每個測試有7個問題,每個問題有10個答案。

如何編寫數據庫查詢而不需要在屏幕上列出這些記錄?

我犯了這樣的解決方案:

$this->db->select('id_test,testName,description,time,type,sum'); 
    $this->db->where('id_test',$idTest); 
    $query['test'] = $this->db->get('tests')->result()[0]; 

    $this->db->select('id_quest,inquiry'); 
    $this->db->where('id_test',$idTest); 
    $query['questions'] = $this->db->get('questions')->result(); 

    $i=0; 
    foreach ($query['questions'] as $question) { 
     $this->db->select('id_answer,response,value'); 
     $this->db->where('id_quest',$question->id_quest); 
     $query['questions'][$i]->answer = $this->db->get('answer')->result(); 
     $i++; 
    } 
    return $query; 
+1

要麼使用循環,要麼寫出循環中的每一行,以查詢返回的內容。 –

+0

因此不可能以我已經寫過的另一種方式寫作? – Sasa

+1

是的,你可以使用,但一個循環是強制性的。 – Phiter

回答

0

我會完全考慮使用「where_in」,而不是在你的數據庫扔噸的查詢。

即..

//... 

$this->db->select('id_quest,inquiry'); 
$this->db->where('id_test',$idTest); 
$query['questions'] = $this->db->get('questions')->result(); 

$questionIds = array(); 

foreach($query['questions'] as $question) 
    $questionIds[] = $question->id_quest; 

$this->db->select('id_answer,response,value'); 
$this->db->where_in('id_quest', $questionIds); 
$answers = $this->db->get('answer')->result(); 

$i=0; // <<< Idk what the main purpose of this is, 
     //  but you do know you can simply use '[]' appending to an array, right? 
foreach ($answers as $answer) { 
    $query['questions'][$i]->answer = $answer; 
    $i++; 
} 

此外,如果性能仍然是一個大問題。研究緩存。 CodeIgniter支持這一點。

https://www.codeigniter.com/userguide3/libraries/caching.html

P.S還應考慮在CI join命令。 https://www.codeigniter.com/userguide2/database/active_record.html

+1

如果性能問題,請不要使用where_in - 這會強制db優化器上的特定執行路徑。如果你發現這可以加快你的查詢速度,那麼你可能沒有做過你的家務管理。 – symcbean

1

您可以作出這樣一個更復雜的查詢,讓您只需要點擊一次數據庫:

SELECT 
t.id_test, t.testName, t.description, t.time, t.type, t.sum, 
q.id_quest, q.inquiry, 
a.id_answer, a.response, a.value 
FROM tests AS t 
LEFT JOIN questions AS q ON q.id_test = t.id_test 
LEFT JOIN answers AS a ON a.id_quest = q.id_quest 
WHERE t.id_test = $idTest; 

那麼你的代碼將是這個樣子:

<?php 
// your database info here 
$db_host = ''; 
$db_user = ''; 
$db_pass = ''; 
$db_name = ''; 

$con = mysqli_connect($db_host,$db_user,$db_pass,$db_name); 
if($con->connect_error) 
    die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); 

$query = "SELECT 
t.id_test, t.testName, t.description, t.time, t.type, t.sum, 
q.id_quest, q.inquiry, 
a.id_answer, a.response, a.value 
FROM tests AS t 
LEFT JOIN questions AS q ON q.id_test = t.id_test 
LEFT JOIN answers AS a ON a.id_quest = q.id_quest 
WHERE t.id_test = ?"; 

if (!$stmt = $con->prepare($query)) 
    die('Prepare Error: ' . $con->error); 

$idTest = 2; 
if (!$stmt->bind_param('i', $idTest)) 
    die('Bind Parameters Error ' . $stmt->error); 

if (!$stmt->execute()) 
    die('Select Query Error ' . $stmt->error); 

while ($stmt->fetch()) 
{ 
// get each resulting answer row, complete with associated question id and test id 
} 
$stmt->close(); 
$con->close(); 
1

從我想到你想要加入表格的問題。我想你應該能夠做這樣的事情:

SELECT test_table.test_name, 
     qestion_table.question, 
     answer_table.answers 
FROM test_table 
INNER JOIN questions_table 
on questions_table.id_test = test_table.id_test 
INNER JOIN answers_table 
ON answers_table.id_quest = questions_table.id_quest 
WHERE test_table.id_test = ? 

這將返回整個結果集作爲一個對象,而不必查詢數據庫幾次。

+1

我也會通過test_name對問題的輸出進行排序,如果結果要作爲簡單數組處理,或者直接輸出以維護分組,請將結果排序。 – symcbean

相關問題