SQLパズル

同期から出された問題、難易度高い。そもそも解けるかどうか検証してないとのこと。無理なら無理でその証明がほしいよなー。
環境はMySQL5系を想定。

登場するテーブル

item
item_id integer
item_name varchar(255) not null

PK(item_id)

category
category_id integer not null
category_name varchar(255) not null

PK(category_id)

item_category
item_id integer not null
category_id integer not null

PK(item_id,item_category)

アイテムとカテゴリの関係はn:n。カテゴリというかタグだね。
どのカテゴリにも属さないアイテムも存在する。

問題

各カテゴリに所属しているアイテムをランダムに5件ずつ取得せよ。ただし結果に同じアイテムが複数出現しないこと。

  • どのカテゴリにも属してないアイテムについても5件出す
  • できればワンクエリで。

出力例

category item
cat_a item_1
cat_a item_2
...
cat_a item_5
cat_b item_6
cat_b item_7
...
NULL item_x
...

雑感

ちょうむずかしい。手続き型言語と組み合わせることなく可能なんだろうか。
ユニーク制約なし、各カテゴリ5件取ってくるだけでも難しい。