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 函数可以帮助我,否则我将不得不做一些乱七八糟的 PHP 东西。

4

3 回答 3

2

我不相信 SQL 具有拆分字符串的功能。这是一些声称可以执行此操作的代码,但我尚未对其进行测试。

更深层次的原因是 SQL 迫切希望您以规范化的形式存储数据。在这种特殊情况下,这意味着每个字段都应该代表有关行主题的单个数据。

本质上,您将存储scale和存储answer在两个单独的表中,您可以使用每个人所属问题的 ID 将它们相互匹配。Scale 将有一个 scale per scale 选项,而不是每个 scale 一行:

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 的所有问题,或计算特定问题有多少选项之类的操作。它看起来更复杂,但它是一种灵活、可扩展、可移植的做事方式。

如果要使用当前格式,则必须返回整个字符串并用其他编程语言将其分解。

于 2012-03-21T18:01:36.720 回答
0

在过程中创建游标以获取每一行并插入到新表中,使用嵌套的 substring_index 分隔每个逗号分隔字段,然后从该新表中选择最大值,使用游标设置循环以对整个表重复此操作并存储每个的最大值新表中的行。最后从最终表中选择 *。

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

这并不能完全回答这个问题,但这至少适用于整数列表。

于 2021-03-06T16:31:08.773 回答