PHPとMy SQLを使って簡易なデーターベースを作っています。
そのなかで任意の順で表を並べ変えたいと思っています。
例えば、table1のt_idに3,6,11,2,4と番号が入っており、table2からtune_idを3,6,11,2,4 の順で並べたいと思っています。
現在は2,3,4,6,11の順でtable2が表示されているので、ORDER BYで指定したいのですが、指定の仕方がよく分かりません。解決方法を教えて頂けますと幸いです。
〇table1
t_id
3,6,11,2,4
11,1,5
4,15,2
~
〇table2
tune_id title comp
1 てすと1 あいう1
2 てすと2 あいう2
3 てすと3 あいう3
~
<?php
$tid = $result['t_id'];
/*何も指定しないとtune_idで昇順で並ぶ*/
/* $stmt2 = $pdo->prepare("SELECT * FROM pet_tune WHERE tune_id in ('$tid')");*/
/*これを並び替えたい↓↓↓*/
/*任意の順に並べたい*/
$stmt2 = $pdo->prepare("SELECT * FROM table2 WHERE tune_id in ('$tid') ORDER BY CASE tune_id WHEN ('$tid') THEN 1");
$stmt2->execute();
$i = 1;
while( $result2 = $stmt2->fetch( PDO::FETCH_ASSOC ) ){
echo "\t<tr><td>$i</td>\n";
echo "\t\t<td>{$result2['title']}</td>\n";
echo "\t\t<td>{$result2['comp']}</td>\n";
echo "\t</tr>\n";
$i++;
}
?>
何かその他必要な情報がありましたら追記いたしますのでご指摘ください。
どうぞよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
もちろん正規化をするのが上策ではありますが、
カンマ区切り文字列のままでも、問題なく文字列関数で処理できます。
案1)
order by FIND_IN_SET(tune_id, '3,6,11,2,4')
案2)
order by INSTR(
concat(',' , '3,6,11,2,4' , ',')
, concat(',' , tune_id , ',')
)
参考)
https://dev.mysql.com/doc/refman/8.0/ja/string-f …
https://dev.mysql.com/doc/refman/8.0/ja/string-f …
す、凄い、、、、
あっさりでできました。
DBの正規化というのをもう少ししっかりできたらと思いつつ、目先の変更が少なくできたこちらをやはり採用しようと思います。。。
教えて頂きありがとうございます。
No.1
- 回答日時:
まず確認。
> 〇table1
> t_id
> 3,6,11,2,4
は
t_id は文字列型で「3,6,11,2,4」という文字列が入っている
という意味でいいですか?
○方針1: データベース側で処理する。
データーベースの基本である「正規化」を考えると、table1のデザイン自体に問題があります。
table1a
行番号 順位 tune_id
1 1 3
1 2 6
1 3 11
...
とすれば、 table2aとtable1aをtune_id でjoinし、「順位」で並び換えることができます。
どうしても現在のtable1を使いたいのなら、そこからtabl1a(あるいは同等の一時テーブル、テーブル変数等)に変換するプロシージャやビューを用意するとか。
○方針2: プログラム側で処理する
一旦全ての結果を配列等の保存し、そこからtune_id = 3,6,11,2,4 の順に読み出す。
PHPなら、 配列に保存するときの添字としてtune_idを使えば、呼び出しも楽になる。
早速ありがとうございます。
今回もともとHTMLで作っていたページをページが増えてきたので
勉強がてらPHP+MySQLの仕組みに変更しようとしています。
(ディスコグラフィーを作っています。それぞれのアルバムに重複する曲があるので曲をtable2に納め、table1から曲のtune_idを指定し曲順に並べようとしています)
DBの構成も何度か変更しているので折角?なので方針1で出来たらと思い改変を始めてみました。(t_id は文字列型です。今も残しています)
>○方針1: データベース側で処理する。
table1aというのはtable1とは別にもう一つtableを作るということでしょうか。どのように構成したらよいか分からず、ひとまずtable1を以下のように変更してみました。
〇table1(アルバムを一件ずつ格納、t_id_〇は曲ID、t_order_〇は曲順、idはアルバムid)
id t_order_1 t_id_1 t_order_2 t_id_2 t_order_3 t_id_3
1 1 4 2 13 3 2
2 1 1 2 4 3 5
~
〇table2(曲を一曲ずつ格納)
tune_id title comp
1 てすと1 あいう1
2 てすと2 あいう2
3 てすと3 あいう3
この構成でそれぞれのt_id_〇をJOINすることはできますか。
DBの構成自体がおかしければアドバイス頂けますと幸いです。
$stmt = $pdo->prepare("SELECT * FROM table1 WHERE id='$id' INNER JOIN table2 ON table1.t_id_1= table2.tune_id");
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C言語って古いですか?
C言語・C++・C#
-
プログラミングの流れ図の問題についての質問です (4)の答えを私は ク したのですが、答えは コ で
ホームページ作成・プログラミング
-
デスクトップパソコンのモニタって分厚いものしかないのでしょうか?分厚いものは邪魔になるので嫌なのです
その他(コンピューター・テクノロジー)
-
-
4
メモリが16GBのパソコンでは17GBの動画は開けないのでしょうか?
その他(コンピューター・テクノロジー)
-
5
本を見ながらPHPを勉強している初心者です。 今困っていること。 本番環境とローカル環境の差で困って
MySQL
-
6
私の回答は、妥当でしょうか?
日本語
-
7
「バ゙」って何?
その他(コンピューター・テクノロジー)
-
8
算数、数学解りません。 足し、引き、掛け、割り算程度しか出来なくても、Excel覚えられますか?
Excel(エクセル)
-
9
Pythonのre.split()の正規表現の使い方
その他(プログラミング・Web制作)
-
10
VBAのサブルーチンとプロシージャについての質問です。 VBAのプロシージャは,サブルーチンのsub
その他(プログラミング・Web制作)
-
11
C言語 バッファについて。
C言語・C++・C#
-
12
VBEを開くのにコマンド名が「Visual Basic」な理由はなぜ?
Visual Basic(VBA)
-
13
擬似コード
C言語・C++・C#
-
14
C言語について。
C言語・C++・C#
-
15
質問です。 配列が100以上の場合は、100単位で繰り返し処理を実行したいのですが、どのように処理を
Java
-
16
C言語について。
C言語・C++・C#
-
17
C言語について。
C言語・C++・C#
-
18
Class ってぱいそんでならったけど使いますか?なんか習う割にはあんまり覚えてないし見ない気がする
Perl
-
19
プログラミング言語の制作方法について
C言語・C++・C#
-
20
これなにがちがうんですか??
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「最高気温が35度以上の日を猛...
-
「第一回模試の3科目の各得点...
-
「第一回模試の3科目の各得点...
-
テーブル名が可変の場合のクエ...
-
下記の問合せを行うクエリを、P...
-
#1062 - '0' は索引 'PRIMARY' ...
-
SQL任意に並び替えをしたい
-
SQLです。こんな感じですか?あ...
-
下の画像はSQLの4大命令の性質...
-
my_itemsテーブルのIDにAUTO_IN...
-
sqlにおけるテーブル名と各カラ...
-
SQLでカラムを追加し、条件に合...
-
下記の問合せを行うクエリを、P...
-
書籍の内容はまともでしょうか?
-
XamppでインストールしたMySQL...
-
php テーブルを作れない
-
MySQLのテーブル作成で 自信が...
-
mysqlのupdate構文についての質...
-
phpMyAdminをCentOS7にインスト...
-
後でemailに追加でPRIMARY KEY...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL任意に並び替えをしたい
-
SELECT文の二段重ね
-
VIEWに対してWHERE句をつける
-
空白文字を含む文字列データの検索
-
sqlの中で、 例えば条件句で AN...
-
Null値が入れられない
-
nullと同じく空白をCountしない...
-
NULLを含む列の足し算
-
MySQLの特定のカラムの内容を全...
-
SQLでLIMIT句を入れるとエラー...
-
JOIN使ってないのに、JOIN操作...
-
テーブル作成時に、「`id` int(...
-
MySQLで関連したデータを横に並...
-
コマンドプロンプト 複数の実...
-
SQL文を入力したらエラー
-
phpでnot null、a_iでテーブル作成
-
phpとSQLで複数条件で検索する...
-
複数の条件がある場合のsqlの書...
-
SQLのエイリアス
-
Mysql 同一テーブルの複数「別...
おすすめ情報