2

注:これは奇妙な質問かもしれません。

ファーストネームとラストネームを含むテーブルがあり、そのスキーマは次のとおりです(テーブル名:random_names):

id          INT             PRIMARY, AUTO INCREMENT
first_name  VARCHAR(100)    NOT NULL
last_name   VARCHAR(100)    NOT NULL

first_nameクエリを使用して、およびからランダムな値をフェッチしたいと思いますlast_name。現在、2つのクエリを使用して値をフェッチしています。

SELECT first_name FROM random_names ORDER BY rand()
SELECT last_name FROM random_names ORDER BY rand()

しかし、ランダムな結果のリストを1つの結果出力で出力できればいいのですが。私は何を取りこぼしたか ?

4

3 に答える 3

3
select
    (select first_name from random_names order by rand() limit 1) as random_first_name, 
    (select last_name from random_names order by rand() limit 1) as random_last_name;

ただし、任意のサイズのテーブルの場合、プログラムでエントリ数を決定し、各列にランダムなオフセットを選択すると、はるかに高速になります。

select
    (select first_name from random_names order by rand() limit $first_name_offset,1) as random_first_name, 
    (select last_name from random_names order by rand() limit $last_name_offset,1) as random_last_name;

ここで、オフセットは0からの結果より1少ない乱数ですselect count(*) from random_names​​。

フォローアップの質問:

しかし、元のテーブルの値の数に等しい結果カウントを一覧表示するのはどうですか?(テーブルのデータをシャッフルするのと同じように)

私はこのようにします:

create temporary table rand_last (id int(11) primary key auto_increment, last_name text) select last_name from random_names order by rand();
create temporary table rand_first (id int(11) primary key auto_increment, first_name text) select first_name from random_names order by rand();
select first_name, last_name from rand_first inner join rand_last using (id);

またはおそらくこのように(random_namesに「id」主キーがあると仮定):

create temporary table rand_one (id int(11) primary key auto_increment, random_names_id int(11)) select id random_names_id from random_names order by rand();
create temporary table rand_two (id int(11) primary key auto_increment, random_names_id int(11)) select id random_names_id from random_names order by rand();
select rand_first.first_name, rand_last.last_name from rand_one inner join rand_two using (id) inner join random_names rand_first on rand_one.random_names_id=rand_first.id inner join random_names rand_last on rand_two.random_names_id=rand_last.id;
于 2012-12-31T03:30:39.827 に答える
1

次のクエリを使用して、とのすべての可能なペアをランダムな順序first_nameで取得できます。last_name

select *
from (select first_name from random_names) a,
     (select last_name from random_names) b
order by rand();
于 2012-12-31T03:36:36.357 に答える
1

あなたもこのようにすることができます-

SELECT first_name, last_name FROM random_names ORDER BY rand()

また

SELECT concat(first_name," ",last_name) fullname FROM random_names ORDER BY rand()
于 2012-12-31T03:47:41.087 に答える