0

簡単にするために、フィールドが1つしかない場合を考えてみましょう。ID。

MySQLでは、結果の最初の列にすべてのIDを1回だけ(そして順番に)リストしたいのですが、2番目、3番目、4番目の列に同じテーブルのランダムなIDを表示したい-4つのIDすべてが各行で異なります。

視覚的に説明します。例:5行のテーブル:

ID:

A

B

C

D

E

結果は次のようになります。

ABDC

BCED

CADB

DECB

EACB

私はMySQLを初めて使用しますが、他のSQLの経験は豊富です。RAND()とLIMITを使用しようとしましたが、間違った結果が得られました。列1に重複があるか、列2、3、4が最後まで1つの結果しか返しませんでした。

助けてください

=)

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 に答える