MySql:按项目数量然后按内容对列表进行排序

娜杰日达·拉茨凯维奇

我使用 MySql 5.7,我需要对这样存储的列表进行排序:

| list_id | item   | item_index |
| ------- | ------ | ---------- |
| 0       | apple  | 0          |
| 0       | bread  | 1          |
| 1       | apple  | 0          |
| 1       | banana | 1          |
| 2       | orange | 0          |

但是这些项目不一定是字符串,它们可以是整数或布尔值,这只是一种简化。

列表应按以下顺序排序:

  1. 列表中的项目数
  2. 如果两个列表具有相同数量的项目,则应按 item_index 的顺序比较它们的项目

所以这个例子的结果应该是:

  1. 2 - 橙色
  2. 1 - 苹果、香蕉
  3. 0 - 苹果、面包

我使用group bycount(*)按列表长度排序,但问题是 - 如果列表中的最大项目数未知,如何按列表内容排序?

我想出的唯一解决方案是N在同一个表上进行左连接,N这个未知的最大列表长度在哪里,每个可能的列表项的每个连接。请参阅 table 和我尝试在DB Fiddle上对其进行排序

有没有办法在不知道列表中项目的最大数量的情况下以这种方式对其进行排序?

凯厄斯·贾德

像这样,如果你想从你的小提琴中取出 5 行:

select * from 

  --the main data
  grocery_lists gl

  --joined with
  inner join

  --the count of items in each list
  (
    select list_id, group_concat(item order by item_index asc) as grouped_items, count(*) as total_count 
    from grocery_lists gl
    group by list_id
  ) ct
  on gl.list_id = ct.list_id

--ordered by the count of items, then the index 
order by ct.total_count, ct.grouped_items, gl.item_index

因此,您将获得如下行:

   2, orange, 0  --sorts first because count - 1
   1, apple, 0   --sorts ahead of list 0 because "apple, banana" < "apple, bread"
   1, banana, 1
   0, apple, 0
   0, bread, 1

如果列表项是整数(并且您需要 5 行)

我认为你需要这样做:

select * from 

  --the main data
  grocery_lists gl

  --joined with
  inner join

  --the count of items in each list
  (
    select list_id, group_concat(LPAD(item, 10, '0') order by item_index asc) as grouped_items, count(*) as total_count 
    from grocery_lists gl
    group by list_id
  ) ct
  on gl.list_id = ct.list_id

--ordered by the count of items, then by padded aggregate ints, then index 
order by ct.total_count, ct.grouped_items, gl.item_index

如果你的项目是整数,用 0 将它们填充到例如 10 宽会使排序工作,因为 "0000000123, 00000000124" < "0000000123, 0000000125"

我选择了 10 宽,因为 int max 是 45 亿;10 位数字。如果你的整数更小,你可以减少填充

如果您正在比较布尔值,类似的策略,可能会将它们转换为 INT(true=0,false=1 ?),以便它们正确排序,即使聚合为字符串时也是如此。

如果 T,T,F 的列表排在 T,F,F 之前,则使 T=0 和 F=1.. 例如

如果你想从你的小提琴中取出 3 行..

从 Shadow 借来,并调整为itemint:

select list_id, group_concat(item order by item_index asc) as items, count(*) as list_length
from yourtable
group by list_id
order by list_length asc, group_concat(LPAD(item, 8, '0') order by item_index asc) asc

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

按数据属性(按字母顺序,然后按数字顺序)对列表项进行排序

按计数然后按字符串对排序的字符串集列表进行排序

首先按字母顺序对列表进行排序,然后按数字对列表进行排序?

如何按日期对查询结果进行排序,然后按MySQL中的特定列值排序

按数字然后按字母对数组列表进行排序

如何按百万像素然后按名称对列表排序?

MySql:如何按2个特定类别然后按价格对查询进行排序?

MySQL按标题排序,然后按分组ID

MySQL | 雄辩的-按先出现然后按ID排序

按特定内容然后按时间戳对MongoDB文档进行排序

按键排序字典,然后按值排序(列表或元组?)

清理数值数组中的未定义项目,然后按javascript对其进行排序

Dplyr / tidyverse如何首先按可用值的数量对列进行排序,然后按字母顺序对列进行排序?

首先对结果进行排序,然后按mysql中的结果集进行分组

尝试先按日期然后按最大数对python中的元组列表进行排序

按值然后按键对字典进行排序

按值然后按键对字典进行排序

按值然后按键对字典进行排序

过滤然后按日期对对象数组进行排序

python按值对字典项进行排序,然后按键

按值然后按键对 Map<Int, Int> 进行排序

MYSQL SELECT 最后 5 个结果,然后按日期对这 5 个结果进行排序?

如何按字母顺序对 csv 数据进行排序,然后按列按数字排序?

按字母顺序对鞋帮进行排序,然后按其相应的鞋帮排序,所有内容均应按排序方式进行排序

使用Comparator.comparing按对象列表然后按第二个属性对对象进行排序

C# LINQ 按属性组集合,然后按列表定义的显式顺序对每个组进行排序

MySQL:计数然后按计数总数排序

MySQL排序日期,然后按零件号

SQL:选择“评论”数量最多的条目,然后按它们的最高平均比率对结果进行排序