• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:mysqlで文字列が一致した数を求め並べ替えたい)

mysqlで一致したキーワードの数を求めて並べ替える方法

このQ&Aのポイント
  • mysqlを使用して、キーワードが一致する数を求めて並べ替える方法について教えてください。
  • 具体的には、テーブル内のキーワードをカンマで区切り、複数のキーワードで検索した場合、一致する数が多い順に結果を表示させたいです。
  • 現在試している方法ではうまくいかず、JOINを使用しても期待した結果が得られません。どのような方法があるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>keyword01,keyword02....keyword10と、別のカラムで作成 これもあまり正しいとは言えません こんな感じでどうでしょう? create table tb (name varchar(30) not null,keyword varchar(30) not null,unique key(name,keyword)); insert into tb values('イチゴ','果物'),('イチゴ','赤'),('イチゴ','甘い'),('イチゴ','春') ,('レモン','果物'),('レモン','黄色'),('レモン','酸っぱい'),('レモン','種あり'),('レモン','柑橘類') ,('ミカン','果物'),('ミカン','橙'),('ミカン','甘い'),('ミカン','酸っぱい'),('ミカン','柑橘類'),('ミカン','冬'),('ミカン','こたつ') ,('ブドウ','果物'),('ブドウ','紫'),('ブドウ','甘い'),('ブドウ','皮あり'),('ブドウ','種あり'),('ブドウ','ワイン') ,('人参','野菜'),('人参','橙'),('人参','固い') ,('大根','野菜'),('大根','白'),('大根','おでん'),('大根','冬'); //ここまでがデータ作成、以下抽出 select name,count(*) as count from tb where keyword in ('果物','甘い','種あり') group by name order by count desc

gatati9184
質問者

お礼

おお! ありがとうございます。 とりあえず教えて頂いた方法で使用したいと思います。 データが多くなって処理が遅くなったらまた何か考えます。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

SQLのやり方としては最悪の部類にはいりますが、できないことはありません。 ただしキーワードデータがちょっとまずいですね たとえば「酸っぱい」と「甘酸っぱい」を仕分けることができません。 そのためにキーワードには最低限前後に「,」をつけます。 create table tb (name varchar(30),keyword varchar(255)); insert into tb values( 'イチゴ',',果物,赤,甘い,春,'),( 'レモン',',果物,黄色,酸っぱい,種あり,柑橘類,'),( 'ミカン',',果物,橙,甘い,酸っぱい,柑橘類,冬,こたつ,'),( 'ブドウ',',果物,紫,甘い,皮あり,種あり,ワイン,'),( '人参',',野菜,橙,固い,'),( '大根',',野菜,白,おでん,冬,'); この状態で以下のようにすればよいでしょう select name, (keyword like '%,果物,%') +(keyword like '%,甘い,%') +(keyword like '%,種あり,%') as k from tb order by k desc #1で指摘がありますが、まずは正規化を学習するところからはじめないと いつまでたってもまっとうなデータ管理ができませんよ

gatati9184
質問者

補足

ご回答ありがとうございます。 実際に作成しようとしているシステムは、あるデータにそれぞれ10個のキーワードを設定し、他のデータに登録されている10個のキーワードとの一致数から関連度が高いデータを探り当てるというシステムです。(youtubeの関連動画みたいに表示させたいと思っています) もともと10個のキーワードはkeyword01,keyword02....keyword10と、別のカラムで作成していたのですが、検索の際に発行するクエリ文がとてつもなく長くなってしまうので一つのカラムにまとめました。 しかしデータベースとしてふさわしくないようなので元に戻します。 今回教えて頂いたクエリ文で一応は思うような処理ができるのですが、 >SQLのやり方としては最悪の部類にはいりますが と指摘を受けるように、あまり効率の良い処理ではないのでどうしようか困っています もし何か良い方法がありましたら知恵を拝借できませんでしょうか

回答No.1

カンマ区切りなどでデータを持つのでなく、正規化しましょう。 今のようなデータの持ち方は、SQLの長所を消しているだけです。

gatati9184
質問者

お礼

ご回答ありがとうございます。 mysqlに関しては入門書しか持っていなかったために正規化と言う言葉さえ知りませんでした。 調べてみたらとても参考になったので、もう少し勉強し正規化してみようと思います。 ありがとうございました。

関連するQ&A