環境
- macOS High Sierra バージョン 10.13.6
- mysql Ver 14.14 Distrib 5.6.38, for osx10.9 (x86_64) using EditLine wrapper
やりたい事
次のようなテーブルがあります。
SQL
1mysql> SELECT * FROM style; 2+----+----------+----------+------------+------------------+ 3| id | salon_id | genre_id | genre | image_url | 4+----+----------+----------+------------+------------------+ 5| 1 | 1 | 1 | short | style_000000.jpg | 6| 7 | 1 | 1 | others | style_000001.jpg | 7| 8 | 2 | 1 | short | style_000002.jpg | 8| 9 | 1 | 4 | medium | style_000004.jpg | 9| 10 | 2 | 4 | others | style_000005.jpg | 10| 11 | 3 | 4 | medium | style_000003.jpg | 11| 12 | 2 | 5 | long | style_000013.jpg | 12| 13 | 4 | 5 | very_short | style_000017.jpg | 13| 14 | 5 | 3 | medium | style_000014.jpg | 14| 15 | 5 | 4 | others | style_000019.jpg | 15| 16 | 1 | 4 | long | style_000015.jpg | 16+----+----------+----------+------------+------------------+ 1711 rows in set (0.00 sec)
genre_id
とgenre
は1:1に対応しています。
ここから各genre
(もしくはgenre_id
)毎にランダムな1行を返すSQLを作りたいです。
やった事
- まず
genre
を一意に取って来たいのでその部分の確認をしました。
SQL
1mysql> SELECT genre FROM style GROUP BY genre; 2+------------+ 3| genre | 4+------------+ 5| long | 6| medium | 7| others | 8| short | 9| very_short | 10+------------+ 115 rows in set (0.00 sec)
- 次に、
genre
がshort
であるものの中からランダムに1行を取り出すSQLをも確認しました。
SQL
1mysql> SELECT * FROM style WHERE genre = 'medium' ORDER BY rand() LIMIT 1; 2+----+----------+----------+--------+------------------+ 3| id | salon_id | genre_id | genre | image_url | 4+----+----------+----------+--------+------------------+ 5| 14 | 5 | 3 | medium | style_000014.jpg | 6+----+----------+----------+--------+------------------+ 71 row in set (0.00 sec) 8 9mysql> SELECT * FROM style WHERE genre = 'medium' ORDER BY rand() LIMIT 1; 10+----+----------+----------+--------+------------------+ 11| id | salon_id | genre_id | genre | image_url | 12+----+----------+----------+--------+------------------+ 13| 11 | 3 | 3 | medium | style_000003.jpg | 14+----+----------+----------+--------+------------------+ 151 row in set (0.00 sec) 16 17mysql> SELECT * FROM style WHERE genre = 'medium' ORDER BY rand() LIMIT 1; 18+----+----------+----------+--------+------------------+ 19| id | salon_id | genre_id | genre | image_url | 20+----+----------+----------+--------+------------------+ 21| 9 | 1 | 3 | medium | style_000004.jpg | 22+----+----------+----------+--------+------------------+ 231 row in set (0.01 sec) 24 25mysql>
分からないこと
恐らくこれらを組み合わせればgenre
毎にランダムな1行を返すSQLが出来るのかなと思うのですが、その先が分かりません。ググった範囲では「subquery」、「left join」、「inner join」辺りがキーになるのかなとは思うのですが、ここで立ち止まってしまっています。
具体的なSQLを教えていただきたいのと、これは出来ればなのですが考え方も教えていただけるとありがたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/12 11:28