MySQL

时间:2015-08-12 11:19:58

标签: mysql

有没有办法在mySQL中以块为单位对结果集进行洗牌?

为了说明:所需的查询将在四个可能的顺序之一中随机返回以下四行(但不是其他可能的顺序,例如,第4项不应该在第3项之前)。

原始订单,B之前的A,item2之前的item1

item,   b_order,    i_order
item1,  A,          1
item2,  A,          1
item3,  B,          1
item4,  B,          2

A之前的B,item1之前的item2

item2,  A,          1
item1,  A,          1
item3,  B,          1
item4,  B,          2

B之前的A,item1之前的item2

item3,  B,          1
item4,  B,          2
item2,  A,          1
item1,  A,          1

B之前的A,item1和item2没有交换

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"变量

1 个答案:

答案 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(块被分组,但块顺序是随机的;块内的项目是随机排序的)