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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

540閲覧

SQL文をスマートに記述したい

nogimareske

総合スコア23

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

2クリップ

投稿2019/09/09 08:02

編集2019/09/09 10:40

SQLをもっとスマートにか記述したいです。
データベースはMysqlを使っており、データベースにはtag1,tag2,tag3,tag4,tag5というカラムがあり、その中のいずれかに一致する値があればデータを引っ張ってくるようにしています。

【コード】
sql = "SELECT code,name,about FROM character WHERE tag1 LIKE word OR tag2 LIKE word OR tag3 LIKE word OR tag4 LIKE word OR tag5 LIKE word OR tag3 LIKE word ORDER BY code DESC LIMIT 1,10";

whereの後のtag1 LIKE word OR tag2 LIKE word OR・・・のところをもっと簡潔に記述する方法はありますか?
他にもお気づきの点があればご教示いただきたいです。

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

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

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

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

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

Orlofsky

2019/09/09 08:08

質問にCREATE TABLE文も載せてください。
m.ts10806

2019/09/09 08:08

SQLだけでいきたいのでしたらPHPなどプログラミング言語要素は排除してSQL文だけを提示したほうが良いでしょう。 それとも「プログラミング言語側でスマートに記述したい」ということでしょうか。 いずれにしてもコードはマークダウンのcode機能を用いてご提示ください。
m.ts10806

2019/09/09 08:10

細かいですがtag3が2回出てきてます。
nogimareske

2019/09/09 08:14

皆様数々のご指摘ありがとうございます。 これから修正いたします。
gentaro

2019/09/09 08:29

修正するならタイトルも直したほうが良い。
gentaro

2019/09/09 09:35

「SQL分」→「SQL文」の事だったんだけど。
nogimareske

2019/09/09 10:41

gentaro様 すいません、誤字に気づいていませんでした。 今訂正しました。
guest

回答2

0

スマートに処理するにはテーブル構造を変えて、tag2~5を正規化して別テーブルに管理します
そもそもLIKEで%word%を処理するのはインデックスが効かないのでスマートではありません。
キーワード検索はスペース区切りにして全文検索にするなどパフォーマンスをあげる工夫が必要です

投稿2019/09/09 08:14

yambejp

総合スコア114769

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

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

nogimareske

2019/09/09 08:30

そもそものテーブル設計が失敗だったんですね。。。 正規化やインデックスについて調べてみます。 参考になるご回答ありがとうございます。
guest

0

ベストアンサー

下記はやったらダメな例

sql

1SELECT code,name,about FROM `character` 2 WHERE concat(tag1,tag2,tag3,tag4,tag5) LIKE '%word%' 3 ORDER BY code DESC LIMIT 0,10

なぜなら下記のようになっていた時

tag1tag2tag3
りんごごりららっぱ

「ごご」や「らら」で引っかかるから。
セパレータ入れてもあまり意味ないですし、
既に出ているようにテーブル構成を見直したほうが良いです。
テーブル構成みなせないなら1つずつorでつなげる今のやり方が最も確実です。

投稿2019/09/09 08:19

m.ts10806

総合スコア80850

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

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

yambejp

2019/09/09 08:31

適当なセパレータを設定してやればconcatが一番有効ですけどね concat(tag1,'|',tag2,'|',tag3,'|',tag4,'|',tag5) ※「|」が使われないという前提
m.ts10806

2019/09/09 08:33

フリー入力だと容赦なく何でも入ってきそうなので「ダメな例」としました。
nogimareske

2019/09/09 08:41

characterは予約語だったんですね。。。知らずに使ってしまいました。 テーブル構成は今から見直せるので見直すことにします。 正規化やインデックスについて調べて設計を考え直そうと思います。 丁寧にいろいろなことをご指摘いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問