【问题标题】:My SQL order by 2 fields with one field changing each time我的 SQL 按 2 个字段排序,每次更改一个字段
【发布时间】:2014-08-25 10:08:45
【问题描述】:

我有一张如下所示的表格:

有 100 个问题。

Table Structure for "Questions Table":

title: 
answerA:
answerB:
answerC:
answerD:
category:
difficulty:

每个问题可以有 5 个类别中的一个(“1、2、3、4 或 5”)和 3 个难度级别中的 1 个(“简单、中等或困难”)。

目前我正在按类别随机对它们进行排序,例如:

"SELECT * FROM Questions order by category, rand()";

所以现在问题按类别排序并随机化。

我希望每个类别的结果也有不同的难度级别。

所以是这样的:

question 1 , category 1, difficulty easy
question 3 , category 1, difficulty medium
question 4 , category 1, difficulty hard
question 2 , category 1, difficulty easy


question 5 , category 2, difficulty easy
question 6 , category 2, difficulty medium
question 7 , category 2, difficulty hard
question 2 , category 2, difficulty easy


question 8 , category 3, difficulty easy
question 10, category 3, difficulty medium
question 9 , category 3, difficulty hard
question 0 , category 3, difficulty easy

等等。

我将如何复制上述内容? 我的排序似乎需要 2 个标准,并且每次为新类别打印问题时,难度标准都需要更改。

我发现的大多数 Google 结果都与按 2 个字段分类但顺序相同。

【问题讨论】:

  • 那么您想为每个类别选择 2 个简单、1 个中等和 1 个困难?
  • @JakubKania 不只是为了确保为每个类别打印的第一个问题是“简单”,第二个是“中等”,第三个是“困难”,第四个是“简单”,第五个是“中等” ”,第 6 次又是“硬”,依此类推。
  • 您确定要在数据库而不是您的应用程序中执行此操作?这是可行的,但没有一个好的解决方案。
  • @JakubKania 如果它可以在查询中可靠地完成,我会更喜欢,因为我不想弄乱已经存在的 PHP。

标签: php mysql sql


【解决方案1】:

好的。所以对于这样的订单,我们首先需要一个grouped rank

(SELECT title, category, difficulty,
   @rank:=CASE 
            WHEN @category <> category OR @difficulty <> difficulty 
                 THEN 0 
            ELSE @rank+1 E
          ND AS rn,
   @difficulty = difficulty,
   @category   = category
FROM
  (SELECT @rank:= -1) s,
  (SELECT @category:= -1) c,
  (SELECT @difficulty:= -1) d,
  (SELECT *
   FROM questions
   ORDER BY category, difficulty, rand()
  ) t) as q

这为我们创建了一个表格,其中每个问题都有其在类别中的排名。现在让我们对其进行排序:

SELECT *
FROM (...) as q
ORDER BY category, rn, CASE 
                          WHEN difficulty = 'easy' 
                              THEN 1 
                          WHEN difficulty = 'medium' 
                              THEN 2
                          ELSE 3
                       END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多