質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

1回答

944閲覧

文字列の中からDBに登録してある文字列を検索、対応した値を表示させたい

kentooooo

総合スコア18

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2019/12/30 06:44

laravel5.6使用中
初心者です。よろしくお願いします。
DBの検索方法、クエリビルダ記述で質問があります。

こんにちわ、ぼくドラえもん、どこでもドア欲しい?

という文字列があり、DBには以下のように登録されています

| id | message1 | message2 | message3 | sendmessage |
| ---- | ---- |
| 1 | こんにちわ | どこでもドア | ?   | どこでもドア出して! |
| 2 | ドラえもん | null | null | げんき? |
| 3 | こんばんわ | null | null | こんばんわ |

この際、上記文章から、message1〜3に登録してある文字列を検索し、
それが一番多いもののsendmessageを表示させたいです。
(今回の例なら、一番上のレコードが文章中に多くあるので、どこでもドア出して!と検索結果を表示させたいです)

like文を使えばいいのかと思い色々試行錯誤していますがうまくいきません。
sql文の考え方、クエリビルダの書き方を教えていただけませんでしょうか。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まず、入力「こんにちわ、ぼくドラえもん、どこでもドア欲しい?」を分かち書きする必要があり
(必ずで区切られる前提ならで分かち書きすればいいのですが、そうでない場合は形態素解析を行う必要があります)

分かち書きしたワードを使用して、SQLで検索を行います。
また、例示されているテーブル構造は正規化されておらず使用しにくいです。
私なら

wordsテーブル

idmessagesend_message_id
1こんにちわ1
2どこでもドア1
31
4ドラえもん2
5こんばんわ3

send_messagesテーブル

idmessage
1どこでもドアだして!
2げんき?
3こんばんわ

という風にわけておきます。

その上で、SQLでいうと

SELECT count(*) FROM words WHERE message IN (分かち書きした結果) GROUP BY send_message_id

みたいな感じで、キーワードの一致率が高いsend_message_idを導きだします。

何をやりたいのかはわかりませんが、この方法だと、表現の揺らぎ(こんにちは、こんにちわの違い、カタカナ、2、2、二)に対応できませんので
追加で揺らぎ訂正と、大量のデータセットが必要になります。
RDBMSだけでどうにかするならこれぐらいが限界だと思います

投稿2019/12/30 07:26

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentooooo

2019/12/30 10:37

文字列の中に、DBに保存されている文字列が含まれているか検索できたらいいな、と思っていたのですが、結構難しそうですね…。 strpos()を使ったやり方なのかな、と思っていたのですが…。
Orlofsky

2019/12/31 00:47

CREATE TABLE, 何件かの INSERT と共に、完全に動作できるものでなくても良いから >strpos()を使ったやり方 を https://teratail.com/help/question-tips#questionTips3-7 の [コード] を使って質問に追記されては? 検索対象の文字列は頻繁に変更されるものかも大切な条件です。
mikkame

2019/12/31 05:16

strposにしても、わかちがきが必要です。 n-gramでもいいですが、n-gramだとより曖昧度が上がる。 具体的にはフルテキストインデックス、全文検索系を調べると理解できると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問