MySQL-连接同一个表4次,包含第2、3和;4随机的,完全不同的

MySQL-连接同一个表4次,包含第2、3和;4随机的,完全不同的,mysql,random,Mysql,Random,为了简单起见,假设它只有一个字段。身份证 在MySQL中,我只想在结果的第一列列出所有ID一次(并按顺序排列),但在第二列、第三列和第四列中,我想显示来自同一个表的随机ID—所有4个ID在每一行中都需要不同 我会直观地解释。如表中有5行: 身份证: A B C D E 结果应该如下所示: A、B、D、C B、C、E、D C A D B D E C B E A C B 我对MySQL非常陌生——尽管我对其他SQL有丰富的经验。我尝试使用RAND()和LIMIT,但得到的结果不正确-要么第1列有重复

为了简单起见,假设它只有一个字段。身份证

在MySQL中,我只想在结果的第一列列出所有ID一次(并按顺序排列),但在第二列、第三列和第四列中,我想显示来自同一个表的随机ID—所有4个ID在每一行中都需要不同

我会直观地解释。如表中有5行:

身份证:

A

B

C

D

E

结果应该如下所示:

A、B、D、C

B、C、E、D

C A D B

D E C B

E A C B

我对MySQL非常陌生——尽管我对其他SQL有丰富的经验。我尝试使用RAND()和LIMIT,但得到的结果不正确-要么第1列有重复的结果,要么第2、3和4列只返回一个结果

请帮忙

=)

这似乎有效:

SELECT
    t1.id id1,
    t2.id id2,
    t3.id id3,
    t4.id id4
FROM
    test t1, test t2, test t3, test t4
WHERE
    t1.id NOT IN (t2.id, t3.id, t4.id)
    AND
    t2.id NOT IN (t3.id, t4.id)
    AND
    t3.id != t4.id
GROUP BY
    t1.id
ORDER BY
    RAND()

这是小提琴:

谢谢-太快了!我把它调整到我的实际表中,但它只给了我它能找到的第一个不匹配的字段。例如,我得到:A B C D B A C D C A B D D A B C E A B C C我有大约200行,希望它产生一个更随机的2,3和4字段。你的意思是它只返回第一行还是只返回第一列?如果是后者,可能是因为我没有给选定的列名添加别名;我现在已经添加了。对不起,我在将结果格式化为可读内容时遇到问题?!你确定你完全是按代码复制的吗?正如你从小提琴上看到的,它很管用。我刚刚看了小提琴——我想我应该多排几行,让你明白我的意思。如果表格有10行,比如从A到J,你将能够更清楚地看到,它只会返回第2、3和4列的前3行,感谢这两个非常快速和有用的回复-我测试了上面的第一行,它返回的正是我想要的。我只想获取这个数据一次,然后将它粘贴到一个数组中,所以希望如果它不是太有效,它会成功;没什么大不了的。只是让你知道。。。我在89行的表格中使用了上面的第一个,如果我只使用了3列,效果还可以,但是如果我全部使用了4列,则需要花费很长时间。id字段已编制索引/主键。无论如何,我刚刚尝试了最后一个——效率非常低,它以极快的速度返回了所有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!