下記のような2つのテーブルがあります。
ランダムに取得した10ユーザーのメッセージを1件ずつランダムに取得
といった事はSQL一回で可能でしょうか。
メッセージを単純にユーザーIDでGROUP BYして
ランダムに返ってきてくれればいいんですが
暗黙的なソートが働くためか毎回同じ値が返ってきてしまいます。
ユーザーテーブル
ユーザーID, 名前, 登録日時
メッセージテーブル
メッセージID, メッセージ, ユーザーID, 登録日時
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
以下でどうでしょうか?
元データ
SQL
1create table mes( 2message_id int unique key, 3message varchar(100), 4user_id int, 5created datetime 6); 7insert into mes values 8(1,'mes1',1,'2017-09-01 00:00:00'), 9(2,'mes2',1,'2017-09-01 00:00:01'), 10(3,'mes3',2,'2017-09-01 00:00:02'), 11(4,'mes4',1,'2017-09-01 00:00:03'), 12(5,'mes5',3,'2017-09-01 00:00:04'), 13(6,'mes6',2,'2017-09-01 00:00:05'), 14(7,'mes7',3,'2017-09-01 00:00:06'), 15(8,'mes8',4,'2017-09-01 00:00:07'), 16(9,'mes9',5,'2017-09-01 00:00:08');
抽出
SQL
1select * from mes as t3 2inner join ( 3select substring_index(group_concat(message_id order by rand()),',',1) as message_id 4from mes as t1 5where exists (select user_id from (select distinct user_id from mes order by rand() limit 3 ) as t2 where t1.user_id=t2.user_id) 6group by user_id 7) as t4 on t3.message_id=t4.message_id 8order by rand();
投稿2017/09/01 03:32
総合スコア114827
0
ベストアンサー
幾つかの手法があります。
こちら(MySQLでランダムにレコードを取得する場合の手法)が参考になるかと。
追記
試してみていませんが、上記中RAND()を使った手法で
SQL
1select * 2 , ( 3 select `メッセージ` from `メッセージテーブル` 4 where `ユーザーid`=usr.`ユーザーid` 5 order by rand() limit 1 6 ) as `メッセージ` 7from `ユーザーテーブル` as usr 8order by rand() 9limit 10
メッセージテーブルの全体を取得したい場合は、メッセージテーブルの主キーに該当するものを取得すればいいのですが、この場合、ユーザーIDと登録日時だと思われるので、登録日時をサブクエリーで取得してさらに結合します。
SQL
1select * 2from ( 3 select * 4 , ( 5 select `登録日時` from `メッセージテーブル` 6 where `ユーザーid`=usr.`ユーザーid` 7 order by rand() limit 1 8 ) as `メッセージ登録日時` 9 from `ユーザーテーブル` as usr 10 order by rand() 11 limit 10 12 ) as v1 inner join `メッセージテーブル` msg 13 on v1.`ユーザーid`=msg.`ユーザーid` and v1.`メッセージ登録日時`=msg.`登録日時`
投稿2017/09/01 03:05
編集2017/09/01 04:31総合スコア25184
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/01 04:30
2017/09/01 04:49