こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2つの列を合わせてソートしたい。

2つの列を合わせてソートしたい。

table名:test

【name】 【area】 【ground】 【bldg】
 aaa    3    65.12   84.94
 bbb    1    24.6    35.14
 ccc    3    112.58  114.5
 ddd    2    54     83.14
 eee    4    89.25   41
 fff     3    74.5    99.10

「ground」と「bldg」はfloat型で、整数と小数点の数値が入っています。
やりたいことは「ground」と「bldg」の2つの列で数値が大きい順でソートしたい。


SELECT * FROM `test` ORDER BY `ground` DESC,`bldg` DESC;
こうすると、当たり前な話ですが、「ground」でソートされた後に「bldg」でソートされてしまいます。
そうではなくて、「ground」と「bldg」を合わせて、ソートしたいのです。

【求める実行結果】

【name】 【area】 【ground】 【bldg】
 ccc    3    112.58  114.5
 fff     3    74.5    99.10
 eee    4    89.25   41
 aaa    3    65.12   84.94
 ddd    2    54     83.14
 bbb    1    24.6    35.14


色々と試してみましたが、うまくいかず前に進まない状態です。
何かいい解決法をご存知の方がいらっしゃいましたらご教授お願い致します。

投稿日時 - 2010-08-04 13:04:06

QNo.6086174

すぐに回答ほしいです

質問者が選んだベストアンサー

実機確認してませんが、こんな感じでは。


SELECT * FROM `test` ORDER BY GREATEST(`ground`,`bldg`) DESC

投稿日時 - 2010-08-04 18:48:06

お礼

ご回答ありがとうございます。

このSQLで理想の結果でデータの抽出ができました。
ありがとうございました。

投稿日時 - 2010-08-04 19:34:51

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

MySQLのバージョンを、少なくともMySQL 4.1 や MySQL 5.0といったレベルまで提示するようにしてください。
また、#2さんへの返答のように、単に「エラーになる」でなく、具体的にどんなエラーメッセージやコードが出るのか、明記するようにしてください。それが、他の人がアドバイスする上で参考になります。

GREATEST関数は、指定された引数のうち、最大値を返す関数であり、今回の質問の用途に合致するのではないかと思います。

ちなみに、MySQL 3.22.5 より前の MySQLでは、GREATEST関数でなく、MAX関数を書くこともできました。



 

投稿日時 - 2010-08-04 18:57:04

お礼

バージョンを明記しようと思い、忘れてしまいました。
次回からは気をつけたいと思います。
ご指摘ありがとうございました。

GREATEST関数というものは知りませんでした。
調べてみたところ、GREATESTの引数には数字が指定してあったのですが
このような使い方も出来るのですね。
とても勉強になりました。ありがとうございました。

投稿日時 - 2010-08-04 19:33:12

ANo.3

SELECT name,area,ground,bldg
from (select name,area,ground,bldg,max(ground,bldg) as maxvalue from test)
ORDER BY maxvalue DESC;

こうね。

動作確認はしていないけど
考え方は間違っていないわよ。

投稿日時 - 2010-08-04 17:58:27

お礼

再度ご回答いただきありがとうございます。

FROM句の後ろはテーブル名しか指定できないと思っていましたがこのような書き方もできるのですね。
(ただエラーが出てしまい、どこを修正したらいいのかわかりません・・・。下記のエラーです↓)
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`bldg`) as maxvalue from `test`) ORDER BY maxvalue DESC' at line 1

今後のために時間をかけて調べてみようと思います。
今回はchukenkenkou様にご回答いただいた内容で求める結果が求められたので一応解決しました。

どうもありがとうございました。

投稿日時 - 2010-08-04 19:46:35

ANo.2

SELECT * FROM `test` ORDER BY MAX(`ground` ,`bldg`) DESC;

投稿日時 - 2010-08-04 13:18:33

お礼

ご回答ありがとうございます。

教えていただいてSQL文を実行してみましたが、エラーになってしまいました。

引き続き解決方法をご存知の方がいらっしゃいましたらよろしくお願いします。

投稿日時 - 2010-08-04 16:18:48

ANo.1

合わせて
って足し算するとかそういう意味?
それなら副問い合わせすればいいけど。
そうじゃないのかしら。

投稿日時 - 2010-08-04 13:07:48

お礼

ご回答ありがとうございます。

足し算ではなく、「ground」と「bldg」の2つに入っている値を大きい数値から順にソートしたいです。

投稿日時 - 2010-08-04 16:17:38

あなたにオススメの質問