2010-09-10 52 views
2

我正在開發一個系統,它從數據庫中選擇問題以生成測試/考試。使用設置參數選擇'隨機'結果

每個問題都有一組'問題類型'('q_type')。我有一個問題數據庫,需要選擇4個問題,每個問題都有不同的'q_type'。

基本的查詢,選擇在此刻4分隨機的問題是:

SELECT * FROM questions ORDER BY RAND() LIMIT 0,4 

這顯然沒有考慮到一個事實,即每一個問題應該有一個不同的「q_type」。

我希望能夠做一些事情,遵循這樣的邏輯(我需要的東西填寫方括號中):

SELECT * FROM questions WHERE ['q_type' is DISTINCT] ORDER BY RAND() LIMIT 0,4 

我一直在使用GROUP BY「q_type」嘗試過,但它只是給出每個'q_type'的第一個問題,每次都不是這種類型的不同問題。 (我正在處理一個誇張的PHP循環,它只需查詢數據庫4次,每次都更新WHERE'q_type'!= XX]。任何幫助都會很棒,因爲我現在完全陷入困境。

感謝您的幫助!

+0

不錯的問題saulposel,我也在等待通過查詢任何解決方案.. :) – 2010-09-10 10:53:20

+0

對於N = 4,你可能會逃脫4個嵌套的SELECT。選擇第二個問題WHERE q_type!= 1st.q_type,選擇第三個問題WHERE q_type!= 2nd.q_type AND q_type!= 1st.q_type等等。顯然是不可擴展的。 – MSalters 2010-09-10 12:22:36

+0

我同意。由於似乎沒有純粹的mySQL選項,因此您可以像上面提到的那樣執行4個嵌套查詢,或者像Fanis建議的那樣執行mysql_fetch_assoc()循環。這完全是一個表現/規模決定。 – saulposel 2010-09-10 12:34:58

回答

1

我不認爲有簡單的方法來做到這一點與簡單的查詢。你可以用一個mysql存儲過程來做,或者爲了節省一些開發時間,用php做。

如果問題池不是特別大,而且這不是太頻繁發生的事情,那麼應該對4個單獨的查詢(每個q_type一個)或者甚至是獲取整個問題設置爲PHP,然後玩弄它,得到4個隨機問題,每個q_type一個。

通過以下(未經測試)代碼,您將獲得隨機排列的所有問題並遍歷它們以獲取每個q_type的第一個問題,然後停止。這不是最優雅的解決方案,但同樣,對於足夠小的數據集和頻率,它應該沒問題。

$questions = array() ; 
$res = mysql_query('SELECT * FROM questions ORDER BY RAND()') ; 
while ($row = mysql_fetch_assoc($res)) { 

    //if we have all 4, stop 
    if (count($questions) == 4) { 
     break ; 
    } 

    $currType = $row['q_type'] ; 
    $currQuestion = $row['questionTitle'] ; 

    if (isset($questions[$currType])) { 
     //already have it, continue to the next 
     continue ; 
    } 

    $questions[$currType] = $currQuestion ; 

} 
+0

如果(因爲它似乎)沒有直接的mySQL功能來做到這一點,然後根據問題總數與問題的數量需要,然後你要麼做個別查詢,要麼按照你的建議循環。我想這是一個表現決定。感謝您建議的mysql_fetch_assoc()代碼,我之前沒有在mysql_fetch_array循環中使用'continue'和'break'。 – saulposel 2010-09-10 13:14:05

0

我決不是一個SQL專家,但這樣做的工作?

SELECT DISTINCT `q_type`, * FROM questions ORDER BY RAND() LIMIT 0, 4 
+0

有趣的我試過,但它不是有效的語法。你看起來不能做SELECT DISTINCT,接着是另一個SELECT參數。 – saulposel 2010-09-10 11:13:27