【问题标题】:Calculate (sum,max,avg) comma separated column in mysql在mysql中计算(sum,max,avg)逗号分隔的列
【发布时间】:2015-06-10 03:47:11
【问题描述】:

我有一个名为POIN 的表,并且有一列包含逗号分隔值。我想计算逗号分隔的每个值。它看起来像duplicate 问题,因为它已经回答了here。但我想使用单个查询而不是创建一个 mysql 函数来实现这一点。

这是我的桌子的样子:

id    poin
------------------
1     1,5,9,3,5
2     2,4,8,5
3     4,7,9,1,5,7

想要的结果:

id     max     min      sum      avg
--------------------------------------
1      1       9        23         4,6
2      8       2        19        4,75
3      9       1        33        5,5

实际上,我在谷歌和这个论坛中搜索过这个并没有得到正确的答案。我无法展示我到目前为止所做的尝试,因为我不知道从哪里开始。

【问题讨论】:

  • 你能解释一下为什么一个函数不适合你吗?
  • 此架构错误且已损坏。您确实需要一个表,其中一列表示 id,列表示 poin,其中相同的 id 一遍又一遍地重复,但每一行在该 id 的 poin 字段中只有一个条目。
  • 永远不要将数据作为逗号分隔的项目存储在一列中。只会给你带来很多麻烦。 (正如你已经注意到的......)

标签: mysql sql


【解决方案1】:

我不知道您在设计什么应用程序,但我认为以逗号分隔而不是创建表详细信息来存储值是不好的设计。您实际上可以在不使用 mysql 函数的情况下解决这个问题。首先,您需要convert comma separated columns into rows,然后您可以进行一些计算。此查询可能会对您有所帮助:

select id,max(val) as max,min(val) as min,sum(val) as sum,avg(val) as avg
from(
    select id,(substring_index(substring_index(t.poin, ',', n.n), ',', -1)) val
        from poin_dtl t cross join(
         select a.n + b.n * 10 + 1 n
         from 
            (select 0 as n union all select 1 union all select 2 union all select 3 
                union all select 4 union all select 5 union all select 6 
                union all select 7 union all select 8 union all select 9) a,
            (select 0 as n union all select 1 union all select 2 union all select 3 
                union all select 4 union all select 5 union all select 6 
                union all select 7 union all select 8 union all select 9) b
            order by n 
        ) n <-- To make this simple, Create a table with one column that has 100 rows.
    where n.n <= 1 + (length(t.poin) - length(replace(t.poin, ',', '')))
    order by val asc
) as c_rows -- c_rows = convert comma separated columns into rows
group by id

结果应该是这样的:

id     max     min      sum      avg
--------------------------------------
1      1       9        23        4,6
2      8       2        19        4,75
3      9       1        33        5,5

【讨论】:

  • 感谢您的回答。我会尝试并再次返回这里提供一些反馈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多