前提
漫画のDBがあるとします。カラムはidとgenresです。
id | genres |
---|
実現したいこと
ある漫画のジャンルと、各idにあるジャンルとの積集合の数を求めたいです。
例
ある漫画のジャンル(仮にid = 10) = ファンタジー,コメディー,アクション
漫画DB
id | genres |
---|---|
1 | アドベンチャー,ファンタジー |
2 | スポーツ,ドラマ |
3 | ファンタジー,コメディー |
... | ... |
10 | ファンタジー,コメディー,アクション |
id = 1 と id = 10 の積集合の数は1
id = 2 と id = 10 の積集合の数は0
id = 3 と id = 10 の積集合の数は2
理想のDB
id | 積集合数 |
---|---|
1 | 1 |
2 | 0 |
3 | 2 |
試したこと
id = 10 のジャンルを行列に変換して、各idのジャンルも行列に変換してintersectをやってもうまくいきません。
sql
1SELECT id, count(genre) 2FROM manga, ( 3 SELECT unnest(string_to_array(genres, ',')) AS genre 4 FROM manga 5 INTERSECT 6 SELECT unnest(string_to_array(genres, ',')) AS genre 7 FROM manga 8 WHERE id = 10 9) AS seki 10GROUP BY id 11;
バージョン
PostgreSQL 13.1
genres をカンマ区切りで持たず、1つの単語で持つ構造にすることはできないのでしょうか。id, manga_id, genre というテーブル構造なら、容易に求められそうです。
できれば CREATE TABLE文とCOPY文などでサンプルテーブルを作りやすく提供してもらえると良いのだけど。
https://www.kaggle.com/code/ayushv322/anime/data
ここのanime.csvのデータを使っています。
例の漫画DBの id は mal_id で genresはそのままgenresです。
ジャンルは複数にしたいです!
回答1件
あなたの回答
tips
プレビュー