我认为如果你也随机化 PHP 中的列会更简单,但作为一个有趣的挑战,我想我会像下面那样做。
它会给你随机的 4 行并随机化/随机排列列值。
首先它只是 GROUP_CONCAT 值 1,2,3,4 但随机化顺序..然后使用 FIND_IN_SET 提取数字的索引..然后使用 ELT() 函数根据这些索引选择 col 值。
SELECT
ELT(FIND_IN_SET(1,rand_indexes),col1,col2,col3,col4) as col1,
ELT(FIND_IN_SET(2,rand_indexes),col1,col2,col3,col4) as col2,
ELT(FIND_IN_SET(3,rand_indexes),col1,col2,col3,col4) as col3,
ELT(FIND_IN_SET(4,rand_indexes),col1,col2,col3,col4) as col4
FROM
(SELECT col1,col2,col3,col4,
(SELECT GROUP_CONCAT(i ORDER BY RAND()) as indexes FROM
(SELECT 1 as i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4)indexes
)as rand_indexes
FROM `table`
)T1
ORDER BY RAND() limit 4
sqlfiddle
更新如果您想像评论中提到的那样垂直随机排列您的列,那么您可以使用此查询。
它基本上以随机顺序选择第一列 4 行,然后与第二列的 4 个随机行连接,依此类推...
SELECT T1.col1,T2.col2,T3.col3,T4.col4
FROM
(SELECT col1,@order1:=@order1+1 as i
FROM (SELECT col1 FROM `table` ORDER BY RAND() LIMIT 4) O1,(SELECT @order1:=0) initialize )T1
INNER JOIN
(SELECT col2,@order2:=@order2+1 as i
FROM (SELECT col2 FROM `table` ORDER BY RAND() LIMIT 4) O1,(SELECT @order2:=0) initialize )T2
ON T1.i = T2.i
INNER JOIN
(SELECT col3,@order3:=@order3+1 as i
FROM (SELECT col3 FROM `table` ORDER BY RAND() LIMIT 4) O1,(SELECT @order3:=0) initialize )T3
ON T1.i = T3.i
INNER JOIN
(SELECT col4,@order4:=@order4+1 as i
FROM (SELECT col4 FROM `table` ORDER BY RAND() LIMIT 4) O1,(SELECT @order4:=0) initialize )T4
ON T1.i = T4.i
sqlfiddle shuffle columns vertically