如何在MySQL中以逗号分隔的字段获取最大值?

时间:2012-03-21 17:47:19

标签: mysql comma

我有一个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东西。

3 个答案:

答案 0 :(得分:2)

我不相信SQL有分割字符串的功能。 Here's some code that claims to do it,但我没有测试过。

更深层次的原因是SQL迫切希望您将数据存储在normalized form中。在这种特殊情况下,这意味着每个字段应代表关于行主题的单个数据。

基本上,您将scaleanswer存储在两个单独的表中,您可以使用每个表所属问题的ID来相互匹配。比例每个比例选项有一行,而不是每个比例一行:

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 :(得分:0)

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

答案 2 :(得分:-1)

SELECT GREATEST(`scale`,0) as greatest_scale FROM `scale`;

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