2012-01-09 10 views
1

データベースにインポートされた外部CSVプロダクトフィードで作業しています。各行の結果は比較表のエンドユーザーに表示されます。Mysql - フィールド内の特定のデータで注文する

特定の列には、個別に並べ替えることを望む多数の詳細があります。フィード/テーブル構造は変更できません。デシベルフィードテーブルの

例:

MODEL | SPECIFICATIONS           | AGE 
Car 1A | 1000 miles recorded, 10 previous owners, No tax included | 3 years 
Car 1B | 1000 miles recorded, 5 previous owners, No tax included | 5 years 
Car 1C | 6000 miles recorded, 7 previous owners, No tax included | 5 years 
Bike 1D | 3000 miles recorded, 5 previous owners, 100 tax included | 4 years 

現在、私のmysql_queryは、 'ORDER BYモデル' ステートメントを使用しています。

「以前の所有者」の数でソートされた比較表をSPECIFICATION列に表示したいとします。

ORDER BYステートメントでこれを行う方法はありますか?

お時間をいただきありがとうございます。

答えて

1

テーブル設定をダミーのMySQLデータベースでテストし、以下の解決策を考え出しました。

SELECT *, CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(specifications, ',', -2), ' ', 2)) as unsigned integer) as previousowners 
FROM dbfeed  
ORDER BY previousowners;  

それは仕様フィールドはによって分離された少なくとも2つのセクションを持っていることを前提とし、所有者の数とテキスト「以前の所有者」の間にスペースがあること。

+0

これは私が欲しいもののために非常にうまくいきます、ありがとう。データ構造のために、私は '2' SUBSTRING_INDEXをかなり安全に削除することができ、TRIMと-2 SUBSTRをそのまま残して、望みの結果を得ることができました。 –

1

はい、それはかなり複雑で壊れやすいので、first rule of database normalizationです。

ORDER BY CAST (
    SUBSTR(specifications 
    , LOCATE(', ', specifications) 
    , LOCATE(' ', specifications, LOCATE(', ', specifications)+2) 
    ) 
) AS INT; 

....のような

何かが ''、 'の間の文字列を検索し、' それに続くだろう。

フォーマットがあなたの例とまったく同じでない場合、珍しい結果が得られます。

+1

MySQLの 'SUBSTR'の3番目のパラメータは、_end_index_ではなく_length_であるため、これを計算するか、' 2'を使用して<99の前の所有者があると仮定し、1桁の末尾のスペースケース。 – mikej

+0

@mikej:確かに、よく見つかった。しかし、 '、'と ''の間の長さを得ることは可能です... SUBSTR(仕様 、LOCATE( '、'、仕様) 、LOCATE( ''、specifications、LOCATE( '、' 、仕様)+2) - 位置( '、'、仕様) ) )AS INT; – symcbean

関連する問題