MySQL查询以计算文本字段中最长的行

Posted

技术标签:

【中文标题】MySQL查询以计算文本字段中最长的行【英文标题】:MySQL query to count longest line in text field 【发布时间】:2015-06-24 07:22:17 【问题描述】:

我在一个由换行符分隔的文本字段中有一些数据。对于每一行,我想获取该行中最长行的长度。

例如,如果一行包含以下数据

the cat\nsat on the\nmat

那么我想要一个返回 10 的查询,即最长行“sat on the”的长度。

【问题讨论】:

我认为这不能仅仅通过 sql 来完成。你应该使用编程。 我同意@Ankur140290 特别是因为mysql中没有split()函数 您可以为此创建一个用户函数,例如参见***.com/questions/17942508/… 【参考方案1】:

这里有一个想法......

为了便于阅读,在此解决方案中,我将“\n”替换为“|”。

记住,仅仅因为你“可以”,并不意味着你“应该”!

SET @string = "the cat|sat on the|mat";

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@string,"|",i),"|",-1)x FROM ints;
+------------+
| x          |
+------------+
|            |
| the cat    |
| sat on the |
| mat        |
| mat        |
| mat        |
| mat        |
| mat        |
| mat        |
| mat        |
+------------+

SELECT LENGTH(SUBSTRING_INDEX(SUBSTRING_INDEX(@string,"|",i),"|",-1))x FROM ints ORDER BY x DESC LIMIT 1;
+------+
| x    |
+------+
|   10 |
+------+

【讨论】:

您的答案或 Mani Deep 的答案都不允许每行有任意数量的换行符,但您的答案更接近标记。你已经给了我足够的能力去做我想做的事,但是我认为你的评论“仅仅因为你可以,并不意味着你应该”在这种情况下是正确的。 好吧,您可以根据需要尽可能频繁地交叉连接 ints 表,但是是的,这一点仍然存在。【参考方案2】:

检查这个sqlfiddle

CREATE TABLE tablename (
  id INT,
  name VARCHAR(50));

INSERT INTO tablename VALUES
  (1, 'the cat\nsat on the\nmat'),
  (2, 'd');

查询:

SELECT
max(length(SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, '\n', numbers.n), '\n', -1))) name
FROM
(SELECT 1 n UNION ALL SELECT 2
 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN tablename
   ON CHAR_LENGTH(tablename.name)
 -CHAR_LENGTH(REPLACE(tablename.name, '\n', ''))>=numbers.n-1
 ORDER BY
 id, n

结果:

name
 10

参考:here

【讨论】:

以上是关于MySQL查询以计算文本字段中最长的行的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询结果,先查含有某字段的数据,再查其他字段的数据

mysql 一张表中如何查询某个字段最长值的那条记录?

Javascript PHP/MySQL - 将数据库中的行值插入文本字段

MySQL 查询以计算电子邮件地址字段中的唯一域

MySQL---查询性能优化

MYSQL查一个字段中 多个值