如何在 MySQL 的逗号分隔字段中获取最大值?
Posted
技术标签:
【中文标题】如何在 MySQL 的逗号分隔字段中获取最大值?【英文标题】:How do I get the maximum value in a comma separated field in MySQL? 【发布时间】:2012-03-21 17:47:19 【问题描述】:我有一个包含逗号分隔值字段的 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 东西。
【问题讨论】:
不要以这种方式存储值:gtowey.blogspot.com/2009/12/… 感谢您回复我。不,它不是基于行的。我将使用测试创建语句更新问题 【参考方案1】:我不相信 SQL 有拆分字符串的功能。 Here's some code that claims to do it,但我还没有测试过。
更深层的原因是 SQL 迫切希望您将数据存储在 normalized form 中。在这种特殊情况下,这意味着每个字段都应代表关于行主题的单个条数据。
基本上,您会将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 的所有问题,或者计算特定选项的数量问题有。它看起来更复杂,但它是一种灵活、可扩展、可移植的做事方式。
如果您想使用当前格式,则必须返回整个字符串并用其他编程语言将其分解。
【讨论】:
MySQL 没有拆分字符串的功能。其他 DBMS(例如 PostgreSQL)确实具有这种能力,并且可以将逗号分隔的列表转换为“表” 谢谢,我担心这将是唯一的解决方案。【参考方案2】:在过程中创建游标以获取每一行并插入到新表中,使用嵌套的 substring_index 分隔每个逗号分隔字段,然后从该新表中选择最大值,使用游标设置循环以对整个表重复此操作并存储新表中每一行的最大值。最后从最终表中选择 *。
【讨论】:
【参考方案3】:SELECT GREATEST(`scale`,0) as greatest_scale FROM `scale`;
这并不能完全回答问题,但这至少适用于整数列表。
【讨论】:
这根本不能回答问题。你觉得GREATEST(
scale,0)
的回报是什么?
试试看,它返回该列中逗号分隔整数的最大值。我在一个项目中使用它。表名和列名与原始问题相关。
scale
不是逗号分隔的整数列表。它是一个由逗号分隔的整数列表组成的字符串。那你为什么不试试呢?
你是对的,查询只返回列表中的第一项 (sqlfiddle.com/#!9/244798/1)。就我而言,第一项同时也是列表中最大的只是巧合。
那么你应该删除这个答案。以上是关于如何在 MySQL 的逗号分隔字段中获取最大值?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?