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

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

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

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

2回答

1028閲覧

[CakePHP] ORDER BY FIELDでの部分一致並び替えについて

satorushimo

総合スコア14

MySQL

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

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/11/05 06:04

編集2018/11/05 06:32

やりたいこと

cakephpでODER BY FIELDを使って特定のカラムを部分一致で一致したもの順に並び替えられるようにしたい

例)
Postテーブル

ID名前
1hoge
2fuga
3piyo

PHP

1... 2$posts = $this->Post->find('all', compact('conditions', 'fields', 'limit', 'recursive', 'order'); 3...

上記のようなコードでPostテーブルの値を取り出す際にhoge,fuga,piyoの順番を文字列中にoの含むもの順で表示したいとすると、

1. hoge 3. piyo 2. fuga

のようになるはずです。

試したこと

$order = array('FIELD(Item.equipment_mansion LIKE, "%a%", "%b%", "%c%"..., "%z%") DESC');

上記のようにorderを設定し、取り出そうしたがorder by fieldでlikeは使えないっぽい(Syntaxエラーが出る)
LIKEにこだわりはないですが、部分一致にする場合これしかないのかなと思っています。
SQLの知識があまりないので教えてください。。。

** また別にでも何かいい方法はないでしょうか? **

修正しました

すみません、テーブルが横向きになっていてわかりにくかったので直しました。
ID、名前がカラム名です。

今自分が調べた中で一番近いのかなと思ったのはcase whenを使う方法です。
調べていく中で初め知った構文だったのでいまだに使い方がわかっていません。泣

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

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

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

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

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

guest

回答2

0

そもそも、

postテーブル

IDitem1item2item3
名前hogefugapiyo

item_idValue
2fuga
1hoge
3piyo

のように横を縦にするなら、以下のようなSQLになるはずです。

SQL

1select 1 as item_ID, item1 as value from post 2union all select 2 as item_ID, item2 as value from post 3union all select 3 as item_ID, item3 as value from post

後は上記に並びを指定するだけです。

SQL

1select * from ( 2select 1 as item_ID, item1 as value from post 3union all select 2 as item_ID, item2 as value from post 4union all select 3 as item_ID, item3 as value from post 5) tmp 6order by value

投稿2018/11/05 06:23

編集2018/11/05 06:24
sazi

総合スコア25173

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

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

0

ベストアンサー

横方向のデータを抽出してソートするのでしょうか?
union allしてorder byしてはいけませんか?

SQL

1select * from( 2select 1 as no ,`1` as data from Post 3union all select 2,`2` from Post 4union all select 3,`3` from Post 5) as sub order by data asc

とか?

縦データ

普通に縦データでidと名前を結合したデータがほしいのかな?

SQL

1create table Post(ID int,name varchar(10)); 2insert into Post values(1,'hoge'),(2,'fuga'),(3,'piyo'); 3select concat(ID,'. ',name) as data from Post order by name asc

投稿2018/11/05 06:17

編集2018/11/05 06:27
yambejp

総合スコア114769

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

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

satorushimo

2018/11/05 06:21

すみません、テーブルがちょっとわかりずらかったと思います。 ID、名前がカラム名です。テーブルが縦横逆になってますね。。。
yambejp

2018/11/05 06:27

縦にデータがあるなら普通のSQLでは?
ms5025

2018/11/05 06:28

名前がカラム名なら1,2,3はrownoってことですか? なら単純にselect値に名前をとってきて、 where句でlikeでしぼり、 order by 名前 ではだめなのですか? そういうことではなくて??
satorushimo

2018/11/05 06:31 編集

アルファベット順がわかりにくくさせてしまっていました。 例えばk, j, i, p, oなど自身で設定した順番にしたい場合はどうすればいいですか?
satorushimo

2018/11/05 06:33

質問本文の例を変更しました! 紛らわしくすみません
yambejp

2018/11/05 06:33

具体的なデータを書いてください おそらくこんな事だと思いますが・・・ order by case xxx when 'k' then 1 when 'j' then 2 when 'i' then 3 when 'p' then 4 when 'o' then 5 else 99 end asc
ms5025

2018/11/05 06:44

このようなことをしなくてはならないテーブル構成に問題あると思います。 hoge、piyo、fugaにソート順を持たせたマスタを作り、 ID 名前は、名前IDを入れる作りにはできませんか? ソート順は名前マスタをjoinさせて、マスタのソート順で行うほうがいいんじゃないかと・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問