mysql:查找 mysql 列中的最短值和最长值
mysql: finding the shortest and the longest value within an mysql-column
我有一个关于在 MySQL-Column "values" 中的连接字符串中找到最短值和最长值的问题。
问题是,列中的值与“|”连接并且可能不同长。
Table:
ID | values
----------------------------------------
A | 12.1|11.23|134.44
B | 11.134|1.3|34.5|152.12|1.31313|134.331|12.31
C | 34.11|1.34|343412.2|13......
问题是:是否有一些简单的可能性仅通过本机 mysql 查询找到两个(最短和最长)值,而不使用任何语言如 Java 或 PHP .
谢谢
最大长度
select * from table order by length(column_name) DESC LIMIT 0,1
最小长度
select * from table order by length(column_name) ASC LIMIT 0,1
如果这不是您想要的,请将您的 SQL 查询添加到问题中。
SQL 对单元格中的值数组不友好。重构模式;那么解决方案就很简单了。
您无法在单个查询中获得所需的结果,至少在 MySQL 的当前版本中无法获得。原因是在您知道最大长度之前,您无法形成查询以从未知长度的定界字符串中获取单个元素。
先求出最长列表有多少个元素:
select max(length(`values`)-length(replace(`values`, '|', ''))) as max from t;
+------+
| max |
+------+
| 6 |
+------+
现在您知道您需要在分隔字符串中测试最多 7 个 "fields"。无法使用可变数量的联合查询来形成 SQL。语法必须在准备时固定,所以你需要知道有多少。
select id, substring_index(substring_index(`values`, '|', 1), '|', -1) as element from t
union
select id, substring_index(substring_index(`values`, '|', 2), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 3), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 4), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 5), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 6), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 7), '|', -1) from t;
+------+----------+
| id | element |
+------+----------+
| A | 12.1 |
| A | 11.23 |
| A | 134.44 |
| B | 11.134 |
| B | 1.3 |
| B | 34.5 |
| B | 152.12 |
| B | 1.31313 |
| B | 134.331 |
| B | 12.31 |
| C | 34.11 |
| C | 1.34 |
| C | 343412.2 |
| C | 13 |
+------+----------+
现在将上面的查询用作子查询,你可以找到最长或最短的:
(select id, element from (...subquery...) as t1 order by length(element) asc limit 1)
union
(select id, element from (...subquery...) as t2 order by length(element) desc limit 1)
+------+----------+
| id | element |
+------+----------+
| C | 343412.2 |
| C | 13 |
+------+----------+
我同意其他人的意见,他们认为这确实是使用 RDBMS 的错误方法。我知道您说过您致力于此结构,但您会发现在长 运行 中,它为您带来的工作比修复架构所需的工作更多。
另请参阅我对 Is storing a delimited list in a database column really that bad?
的回答
我有一个关于在 MySQL-Column "values" 中的连接字符串中找到最短值和最长值的问题。 问题是,列中的值与“|”连接并且可能不同长。
Table:
ID | values
----------------------------------------
A | 12.1|11.23|134.44
B | 11.134|1.3|34.5|152.12|1.31313|134.331|12.31
C | 34.11|1.34|343412.2|13......
问题是:是否有一些简单的可能性仅通过本机 mysql 查询找到两个(最短和最长)值,而不使用任何语言如 Java 或 PHP .
谢谢
最大长度
select * from table order by length(column_name) DESC LIMIT 0,1
最小长度
select * from table order by length(column_name) ASC LIMIT 0,1
如果这不是您想要的,请将您的 SQL 查询添加到问题中。
SQL 对单元格中的值数组不友好。重构模式;那么解决方案就很简单了。
您无法在单个查询中获得所需的结果,至少在 MySQL 的当前版本中无法获得。原因是在您知道最大长度之前,您无法形成查询以从未知长度的定界字符串中获取单个元素。
先求出最长列表有多少个元素:
select max(length(`values`)-length(replace(`values`, '|', ''))) as max from t;
+------+
| max |
+------+
| 6 |
+------+
现在您知道您需要在分隔字符串中测试最多 7 个 "fields"。无法使用可变数量的联合查询来形成 SQL。语法必须在准备时固定,所以你需要知道有多少。
select id, substring_index(substring_index(`values`, '|', 1), '|', -1) as element from t
union
select id, substring_index(substring_index(`values`, '|', 2), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 3), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 4), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 5), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 6), '|', -1) from t
union
select id, substring_index(substring_index(`values`, '|', 7), '|', -1) from t;
+------+----------+
| id | element |
+------+----------+
| A | 12.1 |
| A | 11.23 |
| A | 134.44 |
| B | 11.134 |
| B | 1.3 |
| B | 34.5 |
| B | 152.12 |
| B | 1.31313 |
| B | 134.331 |
| B | 12.31 |
| C | 34.11 |
| C | 1.34 |
| C | 343412.2 |
| C | 13 |
+------+----------+
现在将上面的查询用作子查询,你可以找到最长或最短的:
(select id, element from (...subquery...) as t1 order by length(element) asc limit 1)
union
(select id, element from (...subquery...) as t2 order by length(element) desc limit 1)
+------+----------+
| id | element |
+------+----------+
| C | 343412.2 |
| C | 13 |
+------+----------+
我同意其他人的意见,他们认为这确实是使用 RDBMS 的错误方法。我知道您说过您致力于此结构,但您会发现在长 运行 中,它为您带来的工作比修复架构所需的工作更多。
另请参阅我对 Is storing a delimited list in a database column really that bad?
的回答