2013-01-04 33 views
4

數據庫表結構:顯示從選項不正確的答案

會話表(又名考試表)

SessionId(auto) SessionName 
137    XULWQ 

問表:

SessionId QuestionId OptionId 
137  1   5 
137  2   2 

Option_Table表:

OptionId OptionType 
1   A-C 
2   A-D 
3   A-E 
4   A-F 
5   A-G 
6   A-H 
7   A-I 
8   A-J 
9   A-K 
10  A-L 
11  A-M 
12  A-N 
13  A-O 
14  A-P 
15  A-Q 
16  A-R 
17  A-S 
18  A-T 
19  A-U 
20  A-V 
21  A-W 
22  A-X 
23  A-Y 
24  A-Z 
25  True or False 
26  Yes or No 

回答表:

AnswerId(auto) SessionId QuestionId Answer 
    200   137  1   B 
    201   137  1   D 
    202   137  2   F 
    203   137  2   A 
    204   137  2   C 

我想創建一個網頁,我希望它顯示每個問題的不正確的答案。

我想通過檢索每個問題的選項類型來顯示所有屬於選項類型的字母答案,然後從字母答案中刪除正確的答案,以便僅留下不正確的答案。

選項數組:

$option = array(); 

$option[1]= array(A,B,C); 
$option[2]= array(A,B,C,D); 
$option[3]= array(A,B,C,D,E); 

... 

$option[23]= array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y); 
$option[24]= array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z); 
$option[25]= array(True,False); 
$option[26]= array(Yes,No); 

我的問題是,我需要幫助本節之後。如何在使用mysqli/php和我目前擁有的數據庫的數組之後開始檢索錯誤的答案?

UPDATE:

下面顯示顯示每個問題的正確答案SQL:

SELECT 
     q.QuestionContent, 
     o.OptionType, 
     q.NoofAnswers, 
     GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR '') AS Answer, 
     r.ReplyType, 
     q.QuestionMarks 
    FROM Question q 
    LEFT JOIN Answer an 
     ON q.QuestionId = an.QuestionId 
    LEFT JOIN Reply r 
     ON q.ReplyId = r.ReplyId 
    LEFT JOIN Option_Table o 
     ON q.OptionId = o.OptionId 
    group by q.QuestionContent 

SQL Fiddle with Demo

返回的結果:

|  QUESTIONCONTENT | OPTIONTYPE | NOOFANSWERS | ANSWER | REPLYTYPE | QUESTIONMARKS | 
---------------------------------------------------------------------------------------- 
| Name these 2 flowers |  A-F |   2 |  C | Multiple |    5 | 
|   What is 2+2? |  A-D |   1 | ABD | Single |    5 | 
+1

'function allowed_in'是什麼? – samayo

+0

你怎麼知道問題的正確答案是什麼? –

+0

@BarryChapman通過從答案表中選擇,我忘了發佈查詢來檢查,給我一秒來包括這 – user1881090

回答

1

你的問題是,你的Option_Table的設計方式,解碼OptionType列找出所有可能的答案需要一些不平凡的外部知識。 (事實上​​,你沒有在我的問題中提供足夠的信息,以確定如何做到這一點;我可以猜出你已經向我顯示的那些OptionTypes,但我無法確定如果有,或者可能是其他人。)

倒不如用一個簡單的表,該表,每個OptionId,簡單地列出了所有可能的選項,這樣的更換(或至少增加),該表:

CREATE TABLE Options (
    OptionId INTEGER NOT NULL, 
    OptionAnswer CHAR(1) NOT NULL, -- or whatever type Answer.Answer has 
    PRIMARY KEY (OptionId, OptionAnswer) 
); 

INSERT INTO Options VALUES 
    (1, 'A'), (1, 'B'), (1, 'C'), 
    (2, 'A'), (2, 'B'), (2, 'C'), (2, 'D'), 
    -- ... 
    (25, 'T'), (25, 'F'), 
    (26, 'Y'), (16, 'N'); 

然後你就可以找到所有與這樣的查詢每個問題的正確和錯誤的答案:

SELECT 
    q.QuestionContent, 
    q.NoofAnswers, 
    GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR '') AS RightAnswers, 
    GROUP_CONCAT(DISTINCT 
    CASE 
     WHEN Answer IS NULL THEN OptionAnswer 
     ELSE NULL 
    END 
    ORDER BY OptionAnswer SEPARATOR '') AS WrongAnswers, 
    r.ReplyType, 
    q.QuestionMarks 
FROM Question q 
LEFT JOIN Reply r 
    ON q.ReplyId = r.ReplyId 
LEFT JOIN Options o 
    ON q.OptionId = o.OptionId 
LEFT JOIN Answer an 
    ON q.QuestionId = an.QuestionId AND o.OptionAnswer = an.Answer 
GROUP BY q.SessionId, q.QuestionId 

這裏有一個demo of it on SQLize(輕微改變跳過不包含在您的示例表中的列)。


編輯:另一種解決方案是構建PHP錯誤答案的列表。例如,如果$row是一個對象(如mysqli_fetch_object()返回例如)從原始的查詢包含一個單排,你可以計算出錯誤的答案是這樣的:

// Do this (preferably) before looping over the rows: 
$specialOptionTypes = array(
    'Yes or No' => array('Y', 'N'), 
    'True or False' => array('T', 'F'), 
); 

// Do this for each row: 
if (array_key_exists($row->OptionType, $specialOptionTypes)) { 
    $options = $specialOptionTypes[ $row->OptionType ]; 
} else if (preg_match('/^([A-Z])-([A-Z])$/', $row->OptionType, $match)) { 
    $options = range($match[1], $match[2]); 
} else { 
    // issue warning about unrecognized option type 
    $options = array(); 
} 
$right = str_split($row->Answer); // or explode() on a delimiter, if any 
$wrong = array_diff($options, $right); 
$row->WrongAnswers = implode('', $wrong); // if you actually want a string 

Here's a demo on ideone.com,根據您的樣品查詢輸出。

+0

如果選項類型是固定的,如果你不被允許,你可以自己創建額外的表格,也許作爲[臨時表格](http://dev.mysql.com/doc/refman/5.6/en/privileges-provided.html#priv_create-temporary-tables)創造永久的。你甚至可以在PHP中解析原始的'Option_Table'條目,並根據它們創建臨時表(這可能比在MySQL中做得更容易)。 –

+0

我在我的答案中添加了一個PHP替代方法,參見上文。 –

+0

酷的替代方案將是我可以工作的東西。謝謝 – user1881090

1

我覺得你需要<a href="<?php echo $pages[$currentPages+1] ?>">Continue</a>。否則,你不輸出任何東西。

+0

...或'<?= $ pages [$ currentPages + 1]?>'http://php.net/echo – feeela

+0

只有在啓用了php short_open_tags的情況下才能使用。 –