如何在 MySQL 中以三个为一组显示行 [英] How to show rows in packs of three in MySQL

查看:29
本文介绍了如何在 MySQL 中以三个为一组显示行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张这样的桌子:

ID 类型时间戳1 1012 一 1023 乙 1034 乙 1045 一 1056 乙 1067 一 1078 一 1089 乙 10910 11011 乙 11112 乙 112...

我想显示按类型和时间戳排序的结果,其中类型每 3 行更改一次:

ID 类型时间戳1 1012 一 1025 一 1053 乙 1034 乙 1046 乙 1067 一 1078 一 10810 1109 乙 10911 乙 11112 乙 112...

解决方案

如果您运行的是 MySQL 8.0,请考虑:

SELECT *从 mytable订购者FLOOR((ROW_NUMBER() OVER(PARTITION BY type ORDER BY timestamp) - 1)/3),类型,时间戳

DB Fiddle 演示:

<代码>|身份证 |类型 |时间戳 ||--- |---- |--------- ||1 |一个 |101 ||2 |一个 |102 ||5 |一个 |105 ||3 |乙 |103 ||4 |乙 |104 ||6 |乙 |106 ||7 |一个 |107 ||8 |一个 |108 ||10 |一个 |110 ||9 |乙 |109 ||11 |乙 |111 ||12 |乙 |112 |

<小时>

在早期版本中,您可以使用变量来模拟ROW_NUMBER():

SELECT id、类型、时间戳从 (选择t.*,@rn := CASE WHEN @type = type THEN @rn + 1 ELSE 1 END rn,@type := 类型从我的表交叉连接 (SELECT @type:= NULL, @rn := 1) xORDER BY 类型,时间戳) X订购者楼层((rn - 1)/3),类型,时间戳;

DB Fiddle 演示

I have a table like this:

ID  Type  Timestamp
1   A     101   
2   A     102
3   B     103
4   B     104   
5   A     105   
6   B     106   
7   A     107
8   A     108
9   B     109   
10  A     110   
11  B     111
12  B     112
...

I want to show a result sorted by Type and Timestamp where every 3 rows the Type changes like this:

ID  Type  Timestamp
1   A     101
2   A     102
5   A     105
3   B     103
4   B     104
6   B     106
7   A     107
8   A     108
10  A     110
9   B     109
11  B     111
12  B     112
...

解决方案

If you are running MySQL 8.0, consider:

SELECT *
FROM mytable
ORDER BY 
    FLOOR((ROW_NUMBER() OVER(PARTITION BY type ORDER BY timestamp) - 1)/3),
    type, 
    timestamp

Demo on DB Fiddle:

| id  | type | timestamp |
| --- | ---- | --------- |
| 1   | A    | 101       |
| 2   | A    | 102       |
| 5   | A    | 105       |
| 3   | B    | 103       |
| 4   | B    | 104       |
| 6   | B    | 106       |
| 7   | A    | 107       |
| 8   | A    | 108       |
| 10  | A    | 110       |
| 9   | B    | 109       |
| 11  | B    | 111       |
| 12  | B    | 112       |


In earlier versions, you can use variables to emulate ROW_NUMBER():

SELECT id, type, timestamp
FROM (
    SELECT 
        t.*, 
        @rn := CASE WHEN @type = type THEN @rn + 1 ELSE 1 END rn,
        @type := type
    FROM 
        mytable t
        CROSS JOIN (SELECT @type := NULL, @rn := 1) x
    ORDER BY type, timestamp
) x
ORDER BY 
    FLOOR((rn - 1)/3),
    type, 
    timestamp;

Demo on DB Fiddle

这篇关于如何在 MySQL 中以三个为一组显示行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆