![](/img/trans.png)
[英]Questions are repeating when used order by rand in php online exam system
[英]SQL custom sort order for Exam Questions
對於當前正在從事的項目,我需要創建按特定順序排序的問題列表,而且我目前不確定如何在SQL中執行此操作,希望希望有人可以提供幫助。
我有一個問題列表,我希望能夠按難度順序對它們進行排序(中,簡單,困難),但是要扭轉的是,如果我們有6個問題列表,每個難度級別中有2個問題,那么順序應該看起來喜歡
Medium,
Easy,
Hard,
Medium,
Easy,
Hard
如果我們有八個問題分解為:
Easy x 3
Medium x 3
Hard x 2
它們需要顯示為:
Medium,
Easy,
Hard
Medium,
Easy,
Hard
Medium,
Easy
我開始認為這很可能是PHP而不是SQL的工作,但是如果有人有任何建議,我將不勝感激。
編輯:使用MySQL / PHP
謝謝,科林
這可以使用行號系統來完成。 如果您使用的是MSSQL,則可以使用ROW_NUMBER
,您提到的是使用PHP,因此您可能使用的是MySQL,但我對MySQL的了解還不足以為該平台提供解決方案。
首先,我們按難度對數據進行PARTITION
並分配自己的ROW_NUMBER,然后按此生成的行號進行排序,然后按難度進行排序,如下所示:
CREATE TABLE Questions (
QuestionData ...,
Difficulty nvarchar(10)
)
SELECT
QuestionData,
Difficulty,
(
CASE
WHEN Difficulty = 'Medium' THEN 1
WHEN Difficulty = 'Easy' THEN 2
ELSE 3
END
) AS DifficultyInt,
ROW_NUMBER() OVER ( PARTITION BY Difficulty ORDER BY QuestionData ) AS RowNumber
FROM
Questions
ORDER BY
DifficultyInt
我做了一個SQLFiddle使用ROW_NUMBER在SQL Server中。
SELECT DIFFICULTY, ROW_NUMBER() OVER (PARTITION BY DIFFICULTY ORDER BY DIFFICULTY) AS RN
FROM TABLE1
ORDER BY CASE DIFFICULTY WHEN 'MEDIUM' THEN 1
WHEN 'EASY' THEN 2
WHEN 'HARD' THEN 3 END, RN
感謝您的建議...從您對MSSQL的回答中,我已經進行了一些研究,並提出了我認為合適的MySQL解決方案。
SELECT DIFFICULTY,
@num := if(@type = DIFFICULTY, @num + 1, 1) as row_number,
@type := DIFFICULTY as dummy
FROM Table1 t
ORDER BY row_number, CASE DIFFICULTY WHEN 'MEDIUM' THEN 1
WHEN 'EASY' THEN 2
WHEN 'HARD' THEN 3 END
請參見SQL Fiddle示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.