前提
漫画の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
プレビュー