考试问题的SQL自定义排序顺序

时间:2015-10-09 22:23:51

标签: mysql sql sorting

对于我目前正在处理的项目,我需要创建一个按特定顺序排序的问题列表,而我目前还不确定如何在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

谢谢, 科林

3 个答案:

答案 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

请参阅SQL Fiddle example