0

コンマ区切り値のフィールドを持つ 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 関数があることを願っています。

4

3 に答える 3

2

SQL に文字列を分割する機能があるとは思えません。これを行うと主張するコードを次に示しますが、テストしていません。

これのより深い理由は、SQL がデータを正規化された形式で保存することを必死に望んでいることです。この特定のケースでは、これは、すべてのフィールドが行の主題に関する単一のデータを表す必要があることを意味します。

基本的にscale、andanswerを 2 つの別個のテーブルに格納し、それぞれが属する質問の ID を使用して、それらを互いに照合できます。スケールは、スケールごとに 1 行ではなく、スケール オプションごとに 1 行になります。

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

次に、クエリselect max(scaleoption) from options where question = 2を使用して、質問 2 の最大オプションを取得できます。この形式では、オプションの 1 つが 1 であるすべての質問を検索したり、特定の質問に含まれるオプションの数を取得したりすることもできます。より複雑に見えますが、柔軟で拡張可能で移植可能な方法です。

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

于 2012-03-21T18:01:36.720 に答える
0

各行をフェッチし、ネストされたsubstring_indexを使用してすべてのコンマ区切りフィールドを区切って新しいテーブルに挿入するプロシージャ内でカーソルを作成し、この新しいテーブルからmaxを選択し、カーソルを使用してループを設定し、テーブル全体に対してこれを繰り返し、それぞれの最大値を格納します新しいテーブルの行。最後に、最終テーブルから*を選択します。

于 2012-03-22T07:56:40.940 に答える
-1
SELECT GREATEST(`scale`,0) as greatest_scale FROM `scale`;

それは質問に完全に答えるわけではありませんが、これは少なくとも整数のリストでは機能します。

于 2021-03-06T16:31:08.773 に答える