首页 > 解决方案 > 如何通过交替 (0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,...) 行对结果进行排序

问题描述

我使用 MySQL 来执行数据库事务和 PHP 来运行 MySQL 查询。我想使用is_free列的值 (0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,...) 通过这个序列获取查询结果。我想以 3:6 的比例获取is_free列值的记录。

有没有可能的方法来实现这一目标?

我已经搜索了不同的算法,但没有根据我的要求找到任何东西。我找到了唯一一个通过替代记录抛出结果但我的要求没有满足的查询。

我希望输出像

id     is_free
--     -------
1      0
2      0
3      0
4      1
5      1
6      1
7      1
8      1
9      1
10     0
11     0
12     0

标签: mysqlsql

解决方案


你需要类似的东西ROW_NUMBER() OVER (PARTITION BY is_free ORDER BY id)。一旦有了每个分区的行号(例如 0-0、0-1、0-2、0-3、...、1-0、1-1、1-2、1-3、... ) 您可以使用基本数学对结果进行排序(值 0-0...0-2 和 1-0...1-5 首先,0-3...0-5 和 1-6... 1-11 次,依此类推)。不幸的是 MySQL 5.x 不支持窗口函数,所以你需要使用某种技巧来计算行数。这是一个:

SELECT *
     , rn div IF(is_free = 1, 6, 3) AS gn
FROM (
    SELECT id
         , is_free
         , (SELECT COUNT(*) FROM t AS x WHERE x.id < t.id AND x.is_free = t.is_free) AS rn
    FROM t
) AS x
ORDER BY gn, is_free

db<>fiddle 上的演示


推荐阅读