簡體   English   中英

考題的SQL自定義排序順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM