mysql - 如何通过交替 (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
解决方案
你需要类似的东西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
推荐阅读
- rest - 为 SPA 存储半持久性数据
- c++ - 循环遍历向量时如何获得正确的输出?
- session-cookies - 为什么WKHTTPCookieStore的API——getAllCookies调用了completionHandler却没有session cookies包含
- python - “python svn”和“python pysvn”有什么区别?
- neo4j - 如何计算 neo4j 中树中根节点的总数?
- javascript - 无法弄清楚如何在不和谐服务器中为每个用户添加表,没有给出错误
- python - 如何在django模型中设置字段的值等于函数的返回
- java - Google AppEngine - 无法分配内存错误
- multithreading - 有没有比 mciSendString 更好的播放 Mp3 的方法?
- android - 如何比较 JNI 中的两个 jbyteArray?