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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

551閲覧

unionで結合済みのテーブルの複数列で、LIKEに該当する語句の数が多い順にデータを並び替えたい。

inari1973

総合スコア35

SQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/01/10 09:19

編集2019/01/10 10:26

【実現したいこと】
unionで結合済みのテーブルの複数列で、LIKEに該当する語句の数が多い順にデータを並び替えたい。

SELECT cont1,cont2,null as cont3,null as cont4 FROM フルーツ WHERE cont1,cont2 LIKE '%りんご%' union all SELECT null,null,cont3,cont4 FROM やさい WHERE cont4 LIKE '%りんご%'

テーブル:フルーツ

idcont1cont2
1りんごりんごみかんぶどう
2りんごぶどうりんごりんご
3みかんみかんりんごりんごりんごぶどうりんご

テーブル:やさい

idcont3cont4
4とまとりんご



以下のように「りんご」という語句の数が多い順に並べ替えたいです。

idcont1cont2cont4
3みかんみかんりんごりんごりんごぶどうりんご
2りんごぶどうりんごりんご
1りんごりんごみかんぶどう
4りんご

以下では上手く動きませんでした。

SELECT * FROM フルーツ WHERE cont1,cont2 LIKE '%りんご%' union all SELECT * FROM やさい WHERE cont4 LIKE '%りんご%' order by (LENGTH(cont1) - LENGTH(REPLACE(cont1,"りんご",""))) + (LENGTH(cont2) - LENGTH(REPLACE(cont2,"りんご",""))) + (LENGTH(cont4) - LENGTH(REPLACE(cont4,"りんご",""))) DESC

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

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

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

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

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

Orlofsky

2019/01/10 09:41

SQLをシンプルにパフォーマンス良く実行できるように、正規化 https://oss-db.jp/measures/dojo_info_04.shtml に沿って設計します。通常、第3正規化まで行います。第1正規化で繰り返しを排除します。
guest

回答2

0

ベストアンサー

前回のベストアンサーは、キーとなる文字を数値にしていたのです。数値なのですから、足せばいいだけ。

SQL

1select * from fruit where cont like '%りんご%' 2order by (length(replace(cont,'りんご',''))-length(cont) + length(replace(cont2,'りんご',''))-length(cont2))

情報を小出しにして、使えない、自分で試し済みの回答がついた結果で得したのはPVがあがった運営ですか?

nullが原因だと分かってて、自分でnullにしてるんですから、こうすればいいです。

SQL

1SELECT cont,cont2,0 as cont3,0 as cont4 FROM fruit WHERE cont LIKE '%りんご%' or cont2 LIKE '%りんご%' 2union all 3SELECT 0,0,cont3,cont4 FROM vegi WHERE cont4 LIKE '%りんご%' 4order by (LENGTH(cont) - LENGTH(REPLACE(cont,"りんご",""))) + (LENGTH(cont2) - LENGTH(REPLACE(cont2,"りんご",""))) + (LENGTH(cont4) - LENGTH(REPLACE(cont4,"りんご",""))) DESC

selectでnullを設定している説明がまた本当じゃなくて、実際のcont1がnull許容で、セレクトしたカラムにnullが入ってるならifnull((LENGTH(cont1) - LENGTH(REPLACE(cont1,"りんご",""))),0)とかってやればいいです(ifnullは多分MySQL依存)

例えば↓みたいなことすれば、nullを足すとどうなるかとか、ifnullでどうなるかとか分かります。

SQL

1SELECT (LENGTH(cont) - LENGTH(REPLACE(cont,"りんご",""))),(LENGTH(cont2) - LENGTH(REPLACE(cont2,"りんご",""))), ifnull((LENGTH(cont4) - LENGTH(REPLACE(cont4,"りんご",""))),0), (LENGTH(cont) - LENGTH(REPLACE(cont,"りんご",""))) + (LENGTH(cont2) - LENGTH(REPLACE(cont2,"りんご",""))) + (LENGTH(cont4) - LENGTH(REPLACE(cont4,"りんご",""))) FROM 2(SELECT cont,cont2,null as cont3,null as cont4 FROM fruit WHERE cont LIKE '%りんご%' or cont2 LIKE '%りんご%' 3union all 4SELECT null,null,cont3,cont4 FROM vegi WHERE cont4 LIKE '%りんご%') as r

teratailは、参考書的に使うにはまったくやりにくいのでお薦めできません

投稿2019/01/10 09:35

編集2019/01/11 02:04
papinianus

総合スコア12705

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

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

inari1973

2019/01/10 10:04

ご回答ありがとうございます。 その方法も試したのですが、私の場合は上手くいきませんでした。 おそらくですが、実際のデータはカラム名が異なる表をunion allでくっつけており「SELECT null as cont1,null」などが混在しているため、列名がないデータに当たると処理がスルーしてしまうのかなと思っております。 質問の仕方も難しかったため、今回の質問文には含めておりません。ご迷惑をおかけして申し訳ございませんでした。
inari1973

2019/01/11 05:19

「null as cont」 だけでなく 「0 as cout」もできるんですね。う~ん。深い。まだ分かっていない部分もあるのですが、ありがとうございました。
guest

0

cont1,cont2のどちらかにヒットすればよいですか?
そうなると手っ取り早いのは

cont1とcont2をconcatしてしまうことです。
念の為適当なセパレータをつけて処理して下さい
あとはcontが一つだったときと同じです

concat (cont1,',',cont2) like '%りんご%'

投稿2019/01/10 09:28

yambejp

総合スコア114572

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

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

yambejp

2019/01/11 01:04

はっきりいえば「テーブルの作り方が悪い」です そういった検索を前提とするならcontは正規化して別テーブルで管理します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問