MySQLでリレーションテーブルにランダムな値を入れたいのですが、良い方法ありませんでしょうか? テーブルが4つありまして、 ①my_sentences(本文)
MySQLでリレーションテーブルにランダムな値を入れたいのですが、良い方法ありませんでしょうか? テーブルが4つありまして、 ①my_sentences(本文) ②my_tags(タグ) ③my_contents(コンテンツ) ④my_relations(コンテンツが持っているタグ) うち①②③がすでに数千行 INSERT されています。 今回は④にランダムに、 (tag_ID, content_ID) を1000行 INSERT したいと思っていて、その方法を知りたいです。 下記ソースコードの最後に「-- my_relations にランダムに1000行INSERTしたい」とある部分で、一応イメージのSQLを書いてみましたが…伝わりますでしょうか。 これについてもし巧い書き方がございましたらよろしくお願い致します。 ━━CREATE━━━━━━━━━━━━━━━ -- 文章 CREATE TABLE my_sentences ( ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,sentence VARCHAR(100) NOT NULL ,PRIMARY KEY (ID) ,UNIQUE u_my_sentences_01 (sentence) ,FULLTEXT full_my_sentences_01 (sentence) ); -- タグ CREATE TABLE my_tags ( ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,tag_name VARCHAR(100) NOT NULL ,PRIMARY KEY (ID) ,INDEX idx_my_tags_01 (tag_name) ); -- コンテンツ CREATE TABLE my_contents ( ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,sentence_ID INT(10) UNSIGNED NOT NULL ,PRIMARY KEY (ID) ); -- リレーション CREATE TABLE my_relations ( tag_ID INT(10) UNSIGNED NOT NULL ,content_ID INT(10) UNSIGNED NOT NULL ,PRIMARY KEY (tag_ID, content_ID) ,INDEX idx_my_relations_01 (content_ID) ,CONSTRAINT fk_my_relations_01 FOREIGN KEY (tag_ID) REFERENCES my_tags(ID) ,CONSTRAINT fk_my_relations_02 FOREIGN KEY (content_ID) REFERENCES my_contents(ID) ); ━━INSERT━━━━━━━━━━━━━━━ -- テストデータ INSERT INTO my_sentences (sentence) VALUES ('あああ'),('いいい'),('ううう'); # 実際は数千行あります INSERT INTO my_tags (tag_name) VALUES ('aaa'),('bbb'),('ccc'); # 実際は数千行あります INSERT INTO my_contents (sentence_ID) VALUES (1),(2),(3); # 実際は数千行あります ━━質問━━━━━━━━━━━━━━━━━━━ -- my_relations にランダムに1000行INSERTしたい /* このようなイメージ…? INSERT INTO my_relations (tag_ID,content_ID) VALUES( select ID from my_tags order by rand() limit 1000, select ID from my_contents order by rand() limit 1000 ); */ ━━━━━━━━━━━━━━━━━━━━━━━
ベストアンサー
mysql8なら row_number() over(order by rand()) でランダム順に並べ替えた連番が生成できるので以下のようにして、1000行生成可能。でもそれぞれのテーブルが数千行だとかなり大きなテンポラリーテーブルを展開するので、時間かかるかも。 insert into my_relations select tag.ID , con.ID from (select ID, row_number() over(order by rand()) as rand_order from my_tags ) as tag inner join (select ID, row_number() over(order by rand()) as rand_order from my_contents ) as con on tag.rand_order = con.rand_order and tag.rand_order <= 1000 ;
ありがとうございます。実行しましたがエラーで、 ━━━━━━━━━━━━━━━━━━━━━━ #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \u0027(order by rand()) as rand_order from my_tags ) as tag inner join (select ID, r\u0027 at line 3 ━━━━━━━━━━━━━━━━━━━━━━ よく見たらバージョンが5.7でした。もう8まで出ているのですね。 諦めてPHPからやった方がいいでしょうか…
質問者からのお礼コメント
バージョンにまで対応して頂いた的確なご回答をありがとうございます。
お礼日時:1/22 19:34