有没有办法在mySQL中以块为单位对结果集进行洗牌?
为了说明:所需的查询将在四个可能的顺序之一中随机返回以下四行(但不是其他可能的顺序,例如,第4项不应该在第3项之前)。
item, b_order, i_order
item1, A, 1
item2, A, 1
item3, B, 1
item4, B, 2
item2, A, 1
item1, A, 1
item3, B, 1
item4, B, 2
item3, B, 1
item4, B, 2
item2, A, 1
item1, A, 1
item3, B, 1
item4, B, 2
item1, A, 1
item2, A, 1
我想通过使用
可能会有一种优雅的方法来解决这个问题 SELECT * FROM items ORDER BY random_number_for_each_block, i_order, RAND()
我还没弄清楚我是如何产生这个" random_number_for_each_block"变量
答案 0 :(得分:1)
假设我们有
CREATE TABLE `origin` (
`item` varchar(10) DEFAULT NULL,
`b_order` varchar(4) DEFAULT NULL,
`i_order` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
你可以这样做:
SELECT
*,
@b_rand := IF(b_order!=@current, FLOOR(1000*RAND()), @b_rand) AS factor,
@current := b_order AS current,
@b_rand + RAND() AS ordinal
FROM
(SELECT *
FROM origin
ORDER BY b_order) AS ordered
CROSS JOIN
(SELECT @b_rand:=FLOOR(1000*RAND())) AS init
ORDER BY ordinal
如果您已经知道在初始状态下他们按照b_order
分组跟踪,则不需要按块排序项目的子查询。但拥有它会更安全。
检查fiddle(块被分组,但块顺序是随机的;块内的项目是随机排序的)