为了简单起见,我们假设它只有 1 个字段。 ID。
在 MySQL 中,我想在结果的第一列中列出所有 ID 一次(按顺序),但在第二、第三和第四列中,我想显示同一个表中的随机 ID - 所有 4 个 ID每行都需要不同。
我会直观地解释。例如 5 行表:
ID:
一个
B
C
D
E
结果应如下所示:
A B D C
公元前
CADB
D E C B
E A C B
我对 MySQL 很陌生——尽管在其他 SQL 方面有丰富的经验。我尝试使用 RAND() 和 LIMIT,但得到了不正确的结果 - 第 1 列有重复项,或者第 2,3 和 4 列始终只返回一个结果。
帮助 - 请
=)
最佳答案
MichaelRushton's method can optimize to
SELECT id1, id2, id3, id4 FROM (
SELECT t1.id id1, t2.id id2, t3.id id3, t4.id id4
FROM tt t1
INNER JOIN tt t2 ON t2.id !=t1.id
INNER JOIN tt t3 ON t3.id !=t1.id AND t3.id !=t2.id
INNER JOIN tt t4 ON t4.id !=t1.id AND t4.id !=t2.id AND t4.id !=t3.id
ORDER BY RAND()) AS t
GROUP BY t.id1
ORDER BY NULL;
other method:
SELECT (@a:=`id`) AS a
,(@b:=(SELECT `id` FROM `tt` WHERE id NOT IN (@a) ORDER BY RAND() LIMIT 1)) AS b
,(@c:=(SELECT `id` FROM `tt` WHERE id NOT IN (@a,@b) ORDER BY RAND() LIMIT 1)) AS c
,(@d:=(SELECT `id` FROM `tt` WHERE id NOT IN (@a,@b,@c) ORDER BY RAND() LIMIT 1)) AS d
FROM `tt` AS t,(SELECT @a,@b,@c,@d) AS t2
ORDER BY t.id;
or
SELECT a, b, c,(SELECT `id` FROM `tt` AS td WHERE id NOT IN (a,b,c) ORDER BY RAND() LIMIT 1) AS d
FROM (SELECT a, b,(SELECT `id` FROM `tt` AS tc WHERE id NOT IN (a,b) ORDER BY RAND() LIMIT 1) AS c
FROM (SELECT a,(SELECT `id` FROM `tt` AS tb WHERE id NOT IN (a) ORDER BY RAND() LIMIT 1) AS b
FROM (SELECT `id` AS a FROM `tt` AS ta) AS tt1
) AS tt2
) AS tt3
ORDER BY a;
but its efficiency is very low!
关于MySQL - 连接同一个表 4 次,其中第 2,3 和 4 列随机且全部不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15422058/