mysql - 具有混合选择行顺序的 Sql 查询
问题描述
我有一张如下所示的表格:
| id | group_id | title |
-------------------------
| 1 | 1 | Hello |
| 2 | 1 | World |
| 3 | 2 | Foo |
| 4 | 2 | Bar |
我的查询可能如下所示返回上面的结果:
SELECT * FROM my_table ORDER BY id
问题
如何订购此表,以便组 ID 看起来是随机的,但每次执行查询时仍然相同。
可能的结果示例
这个结果看起来是随机的。如果我一周后运行相同的查询,我希望看到完全相同的顺序,这意味着它不是真正随机的。
| id | group_id | title |
-------------------------
| 2 | 1 | World |
| 4 | 2 | Bar |
| 1 | 1 | Hello |
| 3 | 2 | Foo |
- 从 group_id 的角度来看似乎是随机的。它不再按
group_id
1 1 2 2 排序,而是按 1 2 1 2 排序。它也可能是 2 1 1 2 或不增加的东西。 - 每次都应该返回相同的结果,而不是每次都随机。
- 我可以按标题排序,但如果 a
title
应该更改该行将被重新排序。所以订单需要用id
我猜的。 - 如果可能,我想避免文件或数据库缓存。
可能吗?
解决方案
如何利用模函数为您服务。
SELECT * FROM my_table ORDER BY id % 3,id
定义一个与模函数一起使用的值(在我的示例 3 中)并按 id 的模对表进行排序。这应该在您每次运行查询时返回相同的顺序并返回一些伪随机顺序。
由于模函数可以为不同的 id 返回相同的值,因此您还需要按原始 id 进行排序,以获得已定义的、可重现的顺序。
推荐阅读
- python - Python - 如何用引用表替换列中的所有匹配文本 - 这需要替换单元格中的多个匹配文本
- android - 我们可以在 Android 中编写代码来打开具有多个指纹的不同应用吗
- node.js - 使用 Node JS 连接到 Atlas MongoDB 时出错
- android - 为什么不显示来自相机的用户图像?
- angular - 如何在不同的角度分量中使用相同的功能
- php - 未从 Laravel 中的公用文件夹(https://localhost/storage)获取图像
- multithreading - 为每个对象加载生成一个新线程
- xslt - xslt用虚拟替换空数组
- android - Activity 在 onActivityResult 方法上变为空
- c# - 如何使用 Microsoft.Graph 与登录用户共享日历