【问题标题】:How do I sort data from a mysql db according to a unique and predetermined order, NOT asc or desc如何根据唯一且预定的顺序而不是 asc 或 desc 对 mysql db 中的数据进行排序
【发布时间】:2014-06-23 05:56:14
【问题描述】:

我需要向学生展示 1000 个测试问题,每页 10 个。

问题在 mysql 表中,答案将在另一个表中。

我需要每个学生的问题以不同于其他任何学生的预定顺序出现。排序顺序是在他们注册并放入用户元表时预先确定的。

在 usermeta 表中有一列列出了问题的显示顺序。该列中的顺序对每个学生都是唯一的,如下例所示:8|14|97|54|21|37|54|61 ...等。

向学生展示的第一个问题是第 8 题,然后是第 14 题,然后是第 97 题,依此类推,每页列出 10 个。

我不需要按升序或降序对问题进行排序。另外,如果这有助于找到解决方案,我可以更改数据库结构。

【问题讨论】:

  • FIND_IN_SET 怎么样?

标签: php mysql sorting


【解决方案1】:

另外,我可以更改数据库结构,如果这有助于找到一个 解决方案。

如果可以更改 db 结构,则不要将排序顺序存储为管道分隔字符串,而是将其存储在单独的表中,该表将每个问题映射到给定学生应该出现的顺序。即

student_id, sort_order, question_id
1               1               8
1               2               2
1               3               97

然后在为特定学生选择问题时加入您的排序表。

SELECT q.* FROM 
questions q
JOIN questions_sorting_order qso
ON q.id = qso.question_id
ORDER BY qso.sort_order
WHERE qso.student_id = :student_id

【讨论】:

  • 这是最合乎逻辑的解决方案,所以我继续更改数据库,一切正常。谢谢。
【解决方案2】:
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT i2.i*10+i1.i x
     , FIND_IN_SET(i2.i*10+i1.i,'8,14,97,54,21,37,54,61') y 
  FROM ints i1
     , ints i2
HAVING y > 0 
 ORDER 
    BY y;
+----+---+
| x  | y |
+----+---+
|  8 | 1 |
| 14 | 2 |
| 97 | 3 |
| 54 | 4 |
| 21 | 5 |
| 37 | 6 |
| 61 | 8 |
+----+---+

请注意,第二次忽略 54

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2019-08-09
    • 2021-12-13
    相关资源
    最近更新 更多