【问题标题】:Mysql - count values from comma-separated field [duplicate]Mysql - 计算逗号分隔字段中的值[重复]
【发布时间】:2013-01-31 20:32:49
【问题描述】:

我必须从只读数据库中做一些静态数据,其中值以奇怪的形式存储

示例: 我有 2 行像

ID    text field 
1     1001,1003,1004 
2     1003, 1005

我需要能够数出这是“5”。

我没有写权限,所以不知道如何在不创建函数或类似的东西的情况下立即读取和计数。

【问题讨论】:

  • 看看我的question。有一个满意的答案

标签: mysql count


【解决方案1】:

巧妙的解决方案在这里:How to count items in comma separated list MySQL

LENGTH(textfield) - LENGTH(REPLACE(textfield, ',', '')) + 1

编辑

是的,您可以选择它作为附加列:并使用@HamletHakobyan 的答案中的 CHAR_LENGTH 进行更正:

SELECT 
  ID, 
  textfield, 
  (CHAR_LENGTH(textfield) - CHAR_LENGTH(REPLACE(textfield, ',', '')) + 1) as total 
FROM table

【讨论】:

  • 关于如何将此值作为上表第三列的任何想法。像“总”?我可能是真正的菜鸟,但现在没有时间学习((。
  • 已更新,但最初听起来你想要所有行的总数,这就像@Hamlet 的答案
  • 非常感谢!不知道为什么我害怕把整个查询放在选择中
  • 是的,我正在试验我可以从现有数据中获得什么统计数据......所以稍后会出现
  • SELECT CHAR_LENGTH('a,b,c,d,') - CHAR_LENGTH(REPLACE('a,b,c,d,', ',', '')) + 1 AS total 这会给我5,应该是4
【解决方案2】:
SELECT SUM(LENGTH(textfield) - LENGTH(REPLACE(textfield, ',', '')) + 1)
  FROM tablename

【讨论】:

  • 很好,假设没有字段有空字符串。
【解决方案3】:

所有答案都有一个很小但很重要的遗漏。仅当数据库字符集为utf8 左右时,所有功能都有效,即符号, 获得一个字节。 LENGTH 函数返回 bytes 的数量而不是 chars 的事实。正确答案是使用 CHAR_LENGTH 返回字符数。

SELECT
   SUM(CHAR_LENGTH(textfield) - CHAR_LENGTH(REPLACE(textfield, ',', '')) + 1) cnt
FROM yourTable

【讨论】:

    【解决方案4】:

    你可以这样使用:

    select sum(total) TotalWords
    from
    (
      select length(`text field`) - length(replace(`text field`, ',', '')) + 1 total
      from yourtable
    ) x
    

    SQL Fiddle with Demo

    【讨论】:

      【解决方案5】:
      SELECT (LENGTH(column_name) - LENGTH(REPLACE(column_name, ',', '')) + 1) as value_count
        FROM table_name
      

      这里LENGTH(column_name) - LENGTH(REPLACE(column_name, ',', '')) 给出了每列值中逗号的数量。并且 +1 与此值提供以逗号分隔的值的数量。

      【讨论】:

        【解决方案6】:

        一切都是错误的,对我不起作用。 唯一有效的就是下面这个

        SELECT (length(`textfield`) - length(replace(`textfield`, ',', '')) + 1) as my
        FROM yourtable;
        

        这是我的小提琴

        http://sqlfiddle.com/#!9/d5a8e1/10

        【讨论】:

        • 你不觉得,说“一切都是错的!!!”是错误的。6 年可能会有很多变化。请检查您的答案。
        【解决方案7】:

        如果有人在寻找解决方案,为空字段返回 0。

        IF(LENGTH(column_name) > 0, LENGTH(column_name) - LENGTH(REPLACE(column_name, ',', '')) + 1, 0)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多