对于我目前正在处理的项目,我需要创建一个按特定顺序排序的问题列表,而我目前还不确定如何在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
谢谢, 科林
答案 0 :(得分:0)
这可以使用行号系统完成。如果你正在使用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
答案 1 :(得分:0)
我在SQl Server中创建了一个使用Row_Number的http://opentsdb.net/docs/build/html/user_guide/configuration.html。
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
答案 2 :(得分:0)
感谢您的建议......根据您对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