0

为简单起见,假设它只有 1 个字段。ID。

在 MySQL 中,我想在结果的第一列中仅列出一次(并按顺序)所有 ID,但在第 2、第 3 和第 4 列中,我想显示来自同一个表的随机 ID - 所有 4 个 ID 都需要每一行都不一样。

我会从视觉上解释。例如有 5 行的表:

ID:

一个

C

D

结果应如下所示:

ABDC

公元前

民航局

德银

EACB

我对 MySQL 很陌生——尽管对其他 SQL 有丰富的经验。我尝试使用 RAND() 和 LIMIT,但得到的结果不正确 - 第 1 列有重复项,或者第 2,3 和 4 列一直向下仅返回一个结果。

请帮忙

=)

4

2 回答 2

1

这似乎有效:

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()

这是小提琴:http ://sqlfiddle.com/#!2/d9adc/5

于 2013-03-14T23:34:10.300 回答
1
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!
于 2013-03-15T01:31:16.397 回答