随机化查询中每行两列的顺序

时间:2018-02-14 08:50:07

标签: mysql sql random

我希望将行从一个MySQL表复制到另一个MySQL表,同时随机化两个字段的顺序,即我想从idab获取字段的行{1}}并将其插入table1,但在随机行上交换table2a

这就是我的尝试:

b

我希望这会产生每行一个随机数,但它实际上只是为每个查询生成一个随机数,所以它是a,b表示所有行或b,a表示所有行。我需要改变什么?

P.S:我正在使用变量,因为在两个IF中调用INSERT INTO table2 (id, a, b) SELECT id, IF(@r=RAND() < 0.5, a, b), IF(@r < 0.5, b, a) FROM table1 WHERE table1.filter = 42; 将生成两个单独的数字,我可以两次获得相同的字段。有没有变量的方法吗?

2 个答案:

答案 0 :(得分:2)

使用@variables似乎可行,但MySQL discourages assigning and reading values to variables inside same statement因为:

  

...涉及用户变量的表达式的评估顺序   未定义。

更好的解决方案如下:

-- INSERT INTO ...
SELECT
  id,
  IF(r < 0.5, a, b),
  IF(r < 0.5, b, a)
FROM (
  SELECT id, a, b, RAND() AS r
  FROM table1
  WHERE table1.filter = 42
) x

答案 1 :(得分:0)

INSERT INTO table2 (id, a, b)
set @r=0;
  SELECT
    id,
    IF(@r=RAND() < 0.5, a, b),
    IF(@r        < 0.5, b, a)
  FROM table1
  WHERE table1.filter = 42;