MySQLのソートについて質問です。


[id][type][value]
1 |name |2
2 |name |1
3 |text |1

[]内がMySQLのフィールドで、その下が登録レコードとします。
typeのnameを対象にソートして

ID2
ID1

と並べ替えて出力するには、どういうSQL文を書けばよいのでしょうか?
PHPも使っていますので、PHPを組み合わせた方法だと助かります。

テスト環境は、PHP5.2.0、MySQL4.1.22です。

回答の条件
  • 1人2回まで
  • 登録:2008/05/30 00:08:52
  • 終了:2008/05/30 02:40:17

回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912008/05/30 00:40:59

とりあえず、結果と同様になる SQL です。


不明な点がありましたら、コメントください。

SELECT CONCAT('ID',value) FROM my_table WHERE type = 'name' ORDER BY id;

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_14.htm

id:kt26

例が説明不足で悪かったようです。すみません。


typeにnameやtextとしているのは、フィールドのソートと見立てているからなんです。

例で言うと、ORDER BY name としたいところなのですが、typeに登録されている値はフィールド値じゃないので、それが出来ません。


実際の利用方法は、phpMyAdminの「表示一覧」のように、以下のような表にし、タイトルをクリックして並べ替えたいのです。

name text
1
2
1

2008/05/30 01:01:25
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/05/30 02:06:16

ポイント80pt

コメントで、少しは概要がわかった気がします。


動作確認していないので、バグやタイプミスのある可能性は多大ですが、

アルゴリズムの概要として参考になるでしょうか。

<?php
//  DB名、サーバ名、アカウントは適切に修正してください
$con = mysql_connect("localhost","root","password");
mysql_select_db("database_name", $con);

// type の取得
$res = mysql_query("SELECT DISTINCT type FROM my_table;",$con);
$cnt = mysql_num_rows($res);
$title = "<table border=\"1\">\n<tr>\n";
$body  = "";
for( $i=0 ; $i<$cnt ; $i++ ) {
    $row = mysql_fetch_row( $res );
    $title .= "<td>".$row[0]."</td>\n";

// 各type のデータ取得
    $sub_res = mysql_query( "SELECT value FROM my_table WHERE type = '".$row[0]."' ORDER BY value;", $con);
    $sub_cnt = mysql_num_rows($sub_res);
    for( $j=0 ; $j<$sub_cnt ; $j++ ) {
	$sub_row =  mysql_fetch_row( $sub_res );
	$body .= "<tr>\n";
	$for( $k=0 ; $k< $cnt ; $k++ ) {
// 各type に該当する列だけデータを出力:他は空欄
	    $body .= "<td>". ( ( $i == $j ) ? $sub_row[0] : "&nbsp;" )."</td>\n";
	}
	$body .= "</tr>\n";
    }
}
$title .= "</tr>\n";

echo $title.$body."</table>\n";
mysql_close($con);
?>

動作確認できたら、コメントで補足します。

id:kt26

ありがとうございます。ぜひ参考にします。


この質問をした後に自身でも調べていたのですが、PHP+MySQLで処理するよりも

Javascriptで処理した方が簡単かも知れません。(オープンソースのコードもありますし)


少し難しく考えすぎていたようです。親身になって相談いただき、ありがとうございました。

2008/05/30 02:39:24
  • id:Mook
    下記の点を補足いただけますか。

    ・name が同じ場合、ソートの第2優先順位はどの項目でしょうか。
    ・ID2,ID1 の後ろの1,2 は id の数値ですか? value の数値ですか?
    ・また、"ID" は固定文字列ということでしょうか。
  • id:kt26
    >>name が同じ場合、ソートの第2優先順位はどの項目でしょうか。
    「name+valueの値が同じ場合」という意味でしょうか?
    特に第2優先順位はありません。

    >>ID2,ID1 の後ろの1,2 は id の数値ですか? value の数値ですか?
    IDの数値です。

    >>また、"ID" は固定文字列ということでしょうか。
    IDはauto_incrementの値です。
  • id:Mook
    やっぱり、寝ぼけてました。

    とりあえず、
    ( $i == $j ) ? $sub_row[0] : "&nbsp;"

    ( $i == $k ) ? $sub_row[0] : "&nbsp;"
    ですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません