MySQL - 连接同一个表 4 次,其中第 2,3 和 4 列随机且全部不同

标签 mysql random

为了简单起见,我们假设它只有 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/

相关文章:

mysql - 如何在单个 mysql 查询中多重连接来自多个关系表的值

mysql - 同一聊天中两条消息的响应时间

mysql - 获取mysql中空日期和非空日期的计数

php - 我应该使用 urandom 还是 openssl_random_pseudo_bytes?

java - 不可变集和映射上的 JDK9 随机化

MySQL分隔符语法错误

mysql - phpmyadmin 限制特定数据库的权限

python - 使用随机时,哪种形式返回相同的 50% 机会?

c# - 生成1到3之间的随机数/包括1位小数

python - 每次只返回一个数字的随机数生成器