【发布时间】:2019-05-31 07:46:27
【问题描述】:
我使用 MySql 5.7,我需要对这样存储的列表进行排序:
| list_id | item | item_index |
| ------- | ------ | ---------- |
| 0 | apple | 0 |
| 0 | bread | 1 |
| 1 | apple | 0 |
| 1 | banana | 1 |
| 2 | orange | 0 |
但这些项目不一定是字符串,它们可以是整数或布尔值,只是一种简化。
列表应按以下顺序排序:
- 列表中的项目数
- 如果两个列表的项数相同,则应按照 item_index 的顺序比较它们的项
所以这个例子的结果应该是:
- 2 - 橙色
- 1 - 苹果、香蕉
- 0 - 苹果、面包
我使用group by 和count(*) 按列表长度排序,但问题是 - 如果列表中的最大项目数未知,如何按列表内容排序?
我想出的唯一解决方案是在同一张表上进行N 左连接,其中N 是这个未知的最大列表长度,每个可能的列表项的每个连接。请参阅表格以及我在DB Fiddle 上对其进行排序的尝试。
有没有办法在不知道列表中最大项目数量的情况下以这种方式对其进行排序?
【问题讨论】:
-
列表的“长度”是指“列表中项目数量的升序”
-
我无法弄清楚这个问题试图完成什么,或者“长度”是什么,因为表中没有长度度量或称为长度的字段。 - 啊,我现在明白了。给定 list_id 的所有项目都是同一个列表。您首先想要最大的列表(依此类推),然后在每个列表中按顺序排列每个列表的项目(按索引)。
-
是的,是项目数,“列表中项目数的升序”,我来编辑一下
-
通过“如果项目数相同,则应按照 item_index 的顺序比较项目 - 0 与 0 等”您的意思是“如果两个列表的项目数相同,那么listitems 应按 itemindex 的顺序进行比较,并使用字母顺序来决定哪个列表在前)"
-
我也不太清楚你是否想要逐行(希望得到 5 行的结果?)或者你想要一个分组/聚合集(唯一列表 ID,一列N个列表项,输出3行)
标签: mysql sql group-by sql-order-by