電子書籍の厳選無料作品が豊富!

MAX関数でmysql5のENUM列の内部番号が最大の値を取得したいのですが、文字列としての最大値が取得されてしまいます
(x_x)

enum(
'牡2','牡3','牡4','牡5','牡6','牡7','牡8','牡9','牡10','牡11',
'牝2','牝3','牝4','牝5','牝6','牝7','牝8','牝9',
'せん2','せん3','せん4','せん5','せん6','せん7','せん8','せん9','せん10'
)

例えば上の列の場合max関数は'牡9'を返しますが、どうにかして'せん10'を返すようにできないでしょうか・・・

ORDER BY DESCでは'せん10'が先頭になるので、max()も、どうにかすればできるのではと思った次第です

A 回答 (3件)

マニュアルを、少しは見ましたか?



ENUM列に対し、+0といった操作をすると、インデクス値を得られます。

すなわち、インデクス値が最大のもの、最小のものも、これを利用することで得られます。

例)

select * from t1 where data+0=(select max(data+0) from t1);

ただし、こういった演算を行うと、仮にインデクスが定義されていても、MySQLは活用してくれませんので、データ量が数十万件以上といいった場合は、テーブル設計を見直したほうがいいでしょう。

参考URL:http://dev.mysql.com/doc/refman/5.1/ja/enum.html
    • good
    • 0
この回答へのお礼

こんにちは!

マニュアルを、少しは見ました

しかし、そこは触れないでいただきたかった^^;
マニュアルが面倒だから聞きに来たのです。と説明することも最近はおっくうになってしまったもので・・・

ENUMのインデクスの利用法について、よく分かりました。
しかしWHEREでやるとMAX()条件に一致した行しか取れないので、これを参考にさらにトリッキーなSQLを組み立てることになりそうです。

私としてはMAX()一本で簡単に取れる方法があればと思っていたのですが、どうやら無理そうですね・・・

しかしながら私はすでにMAX()を使わずに、そこそこいい感じのSQLをこしらえることができたので、今回はこれでよしとします;;

お礼日時:2011/02/17 15:00

>マニュアルが面倒だから聞きに来たのです



それは言っちゃまずいですね、嘘でもマニュアル見たけど解らなかったと
言わないと、「教えてクン」認定されますよ

ちなみに、ORDER BY DESC して LIMIT 1をとってもだめですかね?
    • good
    • 0
この回答へのお礼

その件に関しては私も主張したいのですが、ぐっと我慢します!
論争が激しくなると、また削除隊に動かれるので^^

ORDER BYでインデクス順に整列できることは確認済ですが、LIMIT 1だと1行しか取れないので、MAX()一本で簡単に取れる方法があればと思った次第です。

お礼日時:2011/02/18 13:38

MIN()じゃないの?・・・というツッコミはおいておいて



きちんとやりたいならenumなど使わず、外部キー制約をつかって
子テーブル側でソート用のデータを指定しておくなどが有効でしょう
    • good
    • 0
この回答へのお礼

こんにちは!!

MIN()にしたら見事に'せん10'が返りました!

しかし、これは偶然のたまものに過ぎず'せん10'がない状況では'せん2'(望む値は'せん9')が返りました

やはりmysqlの集約関数では難しそうですね。

テーブル構成を変更するのは非現実的なので、当該案件はあきらめることとなりそうです・・・

お礼日時:2011/02/17 11:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す