mysql如何根据某个字段的值进行循环排序?

表 T1 中有若干数据,有字段 C1 用于数据分类,请问是否能在 SELECT 中返回按照 C1 的循环分类排序?

假设 C1 字段有三种数据,分别是”类1“,”类2“,”类3“,期待结果如下:
如 '类1'数据已排完,则类2 类3 补上一次排序
C1

类1,数据。。。
类2,数据。。。。
类3,数据。。。
类1,数据。。。
类2,数据。。
类3,数据。。。。
类1,数据。。。。。。

阅读 3.7k
4 个回答

作者:飞鸟
链接:https://www.zhihu.com/questio...
来源:知乎

mysql> select * from t limit 10;
id c
521 group2
522 group2
523 group3
524 group2
525 group3
526 group2
527 group2
528 group3
529 group2
530 group1

10 rows in set (0.00 sec)

mysql> select c,count(*) from t group by c;
c count(*)
group1 13
group2 19
group3 28

3 rows in set (0.00 sec)

mysql> select c,id from t ,(select @x:=0,@y:=0,@z:=0) x order by
    -> case when c='group1' then @x:=@x+1
    -> when c='group2' then @y:=@y+1
    -> when c='group3' then @z:=@z+1 end
    ->  ,c limit 20;
c id
group1 530
group2 521
group3 523
group1 532
group2 522
group3 525
group1 535
group2 524
group3 528
group1 540
group2 526
group3 533
group1 541
group2 527
group3 538
group1 545
group2 529
group3 539
group1 547
group2 531

20 rows in set (0.00 sec)

思路大体是,列出表T,如果group2第一次出现,则这一行标记为grp=1,第二次出现,标记为grp=2,第n次出现则标记为grp=n……group1和group3也同样处理,然后按照grp 和c 排序即可。

按道理使用mysql来处理这种逻辑不适合,建议在代码层上进行处理

应该实现不了吧,要不直接加一列作为排序列,手动搞?

不是很明白你的需求,可能 mysql 能实现,但不推荐使用 mysql 处理,不知道你的方向是程序还是 DBA ,如果是程序的话建议程序处理。因为数据库的话是共用的,你如果在数据库中进行操作,将会消耗数据库的性能,导致堵塞情况出现是很不好的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题