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

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

mysqlで文字列が一致した数を求め並べ替えたい

name | keyword   --------------------- イチゴ | 果物,赤,甘い,春 レモン | 果物,黄色,酸っぱい,種あり,柑橘類 ミカン | 果物,橙,甘い,酸っぱい,柑橘類,冬,こたつ ブドウ | 果物,紫,甘い,皮あり,種あり,ワイン 人参  | 野菜,橙,固い 大根 | 野菜,白,おでん,冬 このように、キーワードをコンマで分けているテーブルがあるとします。 例えば「果物」「甘い」「種あり」の三つのワードでkeywordを検索した時 name ------- ブドウ  (3ワード一致) イチゴ  (2ワード一致) ミカン  (2ワード一致) レモン  (1ワード一致) 上のように一致するキーワードが多い順に表示させたいのですがうまくいきません select name from tb where keyword like '%果物% or keyword like '%甘い% or keyword like '%種あり% order by count(name); これだと上手くいきませんが、意味的にはこのようにしたいと思ってます。 joinで同じテーブルを結合しても思うように行きませんでした。 何か良い方法があればご教授お願いいたします。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • 果物や野菜からの種の採取方法

    レモンやゆずなどの柑橘系やぶどうやリンゴなどの果物、カボチャなどの野菜は、種がありますが、そこから、種まきをしたいと思っています。 種は周りについた余分なものをきれいに取り除いて洗い、すぐに撒いていいのでしょうか。

  • 行と列の関係性を一括編集

    タイトルが分かり難くてすみません。 教えて頂きたいのは、以下のように変更したいのです。 どのようにするのが最も効率が良いでしょうか? 10   果物   野菜   菓子 ------------------------------------------ 20   桜桃   茄子   煎餅 ------------------------------------------ 30   葡萄   白菜   饅頭 ------------------------------------------ 40   蜜柑   玉葱   団子 ↓↓↓↓↓↓ 10   果物   桜桃 ------------------------------------------ 20   果物   葡萄 ------------------------------------------ 30   果物   蜜柑 ------------------------------------------ 40   野菜   茄子 ------------------------------------------ 50   野菜   白菜 ------------------------------------------ 60   野菜   玉葱 ------------------------------------------ 70   菓子   煎餅 ------------------------------------------ 80   菓子   饅頭 ------------------------------------------ 90   菓子   団子 どうぞ宜しくお願いします。

  • エクセル 関数

    りんご   8 みかん   13 ぶどう   5 スイカ   2 いちご   4 の場合 みかん   13 りんご   8 ぶどう   5 いちご   4 スイカ   2 にできますか? =LARGE(* *)で数字は大→小に並べますが隣の文字(果物)も 一緒に動かしたいのです よろしくお願いします

  • 該当する項目以外の数の総計をだしたい時

    次のようなデータで果物の名前がA1に、果物の数がB1に入力されたときに りんごとみかん以外の果物の数だけをC1のセルに出したい場合は どのような関数を前もって組んでおくのが一番適切なのでしょうか?   A1    B1   りんご  2   みかん  1   ぶどう  1   いちご  2   なし   3 ご回答宜しくお願い致します。

  • 果物や野菜をおしゃぶり出来るグッズ

    記憶が曖昧なのですが、 果物や野菜などを潰さない状態でネットか何かに入れ、 赤ちゃんがネット越しにしゃぶれる離乳アイテムです。 みかんやブドウ等の種を取らなくても、 汁だけ舐めれるようです。 商品名など教えて下さい。 宜しくお願いします。

  • エクセル 複数セル 統合・集計

    詳しい形は画像でアップしていますが,エクセルで品物の品名と,その種類の違いごとに統合・集計できないかと思っています。 これまで質問させていただくなかで,     A      B      C       統合セル    みかん2   ぶどう1   みかん3    みかん5,ぶどう1 と表記するすばらしいマクロを教えていただきました。 今度は,それを発展させた集計表(詳細は画像)ができたらうれしいと考えています。  A         B               C                統合セル 果物  果物4(みかん2,ぶどう2) 果物3(なし1,みかん2)  果物7(みかん4,なし1,ぶどう2) 野菜  野菜3(トマト3)        野菜1(カボチャ1)      野菜4(トマト3,カボチャ1) という風です。 マクロだけでなく,別表を作ったり,セルの配置を工夫したり…といった手が加わっても構いません。 同じような質問を繰り返してしまい,たいへん心苦しいですが,どうぞご教授いただけましたら助かります。   

  • ミキサーでのスムージーについて

    ろくに料理もしないのですが、健康をよくするため、ミキサーを始めようと思います。 SKR-J250を購入しました。 本日りんご、みかん、いちご、キウイ、バナナ、ホウレンソウ、小松菜、水菜を切りました。 他試そうと思ってるのはレモン、パイン、セロリ、アボガド、春菊、アサイーです。 以下簡単でいいですので教えてください。 (1)果物+牛乳、果物+野菜+水の組み合わせがよいのでしょうか。 (2)りんご、みかん、キウイの皮はそのままでいいのでしょうか。 (3)いちごのヘタは手でちぎっていますか。 (4)長続きさせるためなるべく包丁を使わずできるものがいいのですが、バナナ、みかん他何がありますか? (5)どのような果物、野菜が栄養価がありますでしょうか。おすすめなのとか。。 (6)豆乳がいいと聞きましたが、どのように売っているのでしょうか。コンビニとかの調整豆乳とかのことでしょうか。 (7)スムージーににんじんはNGと聞きましたが、正しいですか。 (8)今日買ってきてまとめて切った野菜、果物が冷蔵後に入りきらないのですが、どれくらい持つのでしょうか。冷蔵庫の場合、外だしの場合それぞれで。。(次からは少しずつ切ります。)

  • 複数キーワードを複数カラムに照会するSQL文?

    頭の整理ができないので技術的なこともさることながら、SQL構築の考え方もうかがいたいのですが、 以下のテーブルに対して、スペース区切りで複数キーワードをAND条件で結ぶとして ID MyCol1 MyCol2 -------------------------- 1 いちご みかんジュース 2 ぶどう いちごみるく 3 みかん すいかジュース 4 すいか めろんソーダ 5 めろん ぶどうガム 検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。 スペース区切りで複数キーワードをAND条件で結ぶSQLは、以前教わりました。 http://okwave.jp/qa/q1212708.html $sql = 'select * from t_url'; if ($title != '') { $titles = array(); foreach (preg_split('/(\s| )+/', $title) as $word) { array_push($titles, "MyCol1 like '%$word%'"); } $sql .= ' where (' . implode(' and ', $titles) . ')'; } 今回の質問は、受け取った$titleを「MyCol1」だけでなく「MyCol1かMyCol2」にも同じ照会する方法をうかがいたいです。 検索キーワードが「いちご ソーダ」だったとき、MyCol1だけなら、 and (MyCol1 like '%いちご%' and MyCol2 like '%ソーダ%') でよいわけですが、MyCol2はどう熱かったらいいのでしょうか。 and (MyCol1 or MyCol2 like '%いちご%' and MyCol1 or MyCol2 like '%ソーダ%') みたいにできればよいのでしょうが。 PHPのコードも、上記のものだとMyCol1にしか照会がかかりませんが・・・

    • ベストアンサー
    • MySQL
  • 絵にかけそうな野菜・果物

    簡単に絵に描けそうな野菜や果物はありますか? たとえばりんご、みかん、にんじん、しいたけ、ぶどう・・・といった感じで 野菜や果物っていろいろあると思うのですがいざ考えてみるとなかなかいいものが思いつかないのでどうぞアドバイスよろしくお願いいたします。

  • 果物は何を食べていますか。

    果物は何を食べていますか。 うちの近所だけかもしれないけど、 とにかく果物(野菜も)が高い。 梨、ブドウ、みかん…。リンゴはちょっと安いけど…。 みなさんは、 最近、何の果物を食べていますか。