2012-03-21 16 views
0

フィールドがカンマ区切りのMySQLテーブルがあります。最大値を得るにはどうすればよいですか?MySQLのカンマ区切りフィールドで最大値を取得するにはどうすればよいですか?

例:

CREATE TABLE `test`.`scale` (`scale` VARCHAR(500)); 

INSERT INTO `test`.scale 
VALUES 
('1,5,0.3,0.8,1'), 
('0.5,0.7,0.1,0.3'), 
('7,0.5,0.7,4'); 

規模:

1,5,0.3,0.8,1 
0.5,0.7,0.1,0.3 
7,0.5,0.7,4 

答え:私は、この文字列の最大値を選択するにはどうすればよい

5 
0.7 
7 

残念ながら、以前の人がコンマ区切りのソリューションを実装した方法を変更することはできません。私が助けることができるMySQL関数があることを願っています。そうでなければ、面倒なPHPの処理をしなければなりません。

+5

値をこのように保存しないでください。http://gtowey.blogspot.com/2009/12/how-to-fix-comma-separated-list-of-doom.html – TehShrike

+0

私に戻ってくれてありがとう。いいえ、行ベースではありません。テスト作成ステートメントで質問を更新します – richie

答えて

2

SQLに文字列を分割する機能がないと思います。 Here's some code that claims to do itが、私はそれをテストしていない。

これが深刻な理由は、SQLでは必然的にデータをnormalized formに保存する必要があるからです。この特定の場合、これは、すべてのフィールドが行の件名に関する単一ののデータを表す必要があることを意味します。

本質的にはscaleanswerを2つのテーブルに分けて保存します。それぞれのテーブルには、それぞれが所属する質問のIDを使用して一致させることができます。あなたはその後、このフォーマットはまた、あなたがどこのすべての質問を見つけるようなことを行うことができます質問2の最大のオプションを取得するには、クエリselect max(scaleoption) from options where question = 2を使用することができ

OPTIONS      ANSWERS 
question | scaleoption  question | answer 
---------|------------  ---------|------- 
     1 | 1.5     1 | 5 
     1 | .3      2 | .7 
     1 | .8    ... 
     1 | 1 
     2 | .5 
     2 | .7 
... 

:スケールは、スケールオプションごとの規模ごとではない1行に1行を持っているでしょう1つのオプションが1つであるか、特定の質問にいくつのオプションがあるかを数えます。それはより複雑に見えますが、柔軟性があり、拡張可能で、移植性の高い方法です。

現在の形式を使用する場合は、文字列全体を返し、別のプログラミング言語で分割する必要があります。

+0

MySQLには文字列を分割する機能がありません。他のDBMS(PostgreSQLなど)はその能力を持ち、コンマ区切りのリストを「テーブル」に変換することができます –

+0

ありがとう、私は唯一の解決策であると思っていました。 – richie

+0

@a_horse_with_no_nameありがとう、知っておくと便利です! – octern

0

カーソルを作成して各行をフェッチし、すべてのカンマ区切りフィールドをネストしたsubstring_indexを使用して挿入し、この新しいテーブルからmaxを選択して、カーソルを使用してループを設定してテーブル全体とストア新しいテーブルの各行の最大値。最後は最終テーブルから*を選択します。

関連する問題