Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MySQL存储过程对管道分隔字段进行计数和排序?_Mysql_Stored Procedures - Fatal编程技术网

如何使用MySQL存储过程对管道分隔字段进行计数和排序?

如何使用MySQL存储过程对管道分隔字段进行计数和排序?,mysql,stored-procedures,Mysql,Stored Procedures,我需要创建一个存储过程,它将返回管道分隔字段中遇到的每个唯一值的总计数,大致如图2所示。幸运的是,如果这使事情变得更简单,那么这些值将永远是“value1”、“value2”或“value3”。我原本计划输出数据并在PHP中进行排序,方法是分解数据并循环字符串匹配,但有一些特殊情况需要我使用存储过程,而我以前从未使用过存储过程 我解释的数据格式如下所示,“valuelist”字段是一个包含许多值的管道分隔字段。我需要找出给定日期的每个值出现的次数 (下图1)数据库中的数据是什么样子的 id, d

我需要创建一个存储过程,它将返回管道分隔字段中遇到的每个唯一值的总计数,大致如图2所示。幸运的是,如果这使事情变得更简单,那么这些值将永远是“value1”、“value2”或“value3”。我原本计划输出数据并在PHP中进行排序,方法是分解数据并循环字符串匹配,但有一些特殊情况需要我使用存储过程,而我以前从未使用过存储过程

我解释的数据格式如下所示,“valuelist”字段是一个包含许多值的管道分隔字段。我需要找出给定日期的每个值出现的次数

(下图1)数据库中的数据是什么样子的

id, date, valuelist
1, 2017-01-01, value1|value2|value3
2, 2017-01-01, value1|value2
3, 2017-01-01, value1
因此,
从db.table中选择日期、值列表的查询,其中id=1将返回
2017-01-01,value1 | value2 | value3

(下图2)所需的计数输出,表示每个值在特定日期出现的次数。例如,使用图1中的数据,如果我们询问2017-01-01,输出应该如下所示

value1: 3
value2: 2
value3: 1

假设您正在将
3 | 2 | 1
转换为
3
2
1
的单独行;MySQL(或几乎任何基于SQL的RDBMS)不适合这种输出

无需进入实际的过程代码,在过程中,您可以:

  • 将值存储在局部变量中
  • 使用更通用的存储函数(在这里很容易找到)来“拆分”分隔符上的字符串
    ;或者使用“get n-th”函数对字符串进行“循环”以迭代方式拆分
  • 将值存储到临时表中
  • 使用临时表上的SELECT作为过程的结果集
  • 看看这个:

    按给定样本数据详细说明:

    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    2017-01-01  value1  3
    2017-01-01  value2  2
    2017-01-01  value3  1
    
    最终查询:

    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    2017-01-01  value1  3
    2017-01-01  value2  2
    2017-01-01  value3  1
    
    结果:

    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select 1 as id, '2017-01-01' as date, 'value1|value2|value3' as valuelist union all
    select 2, '2017-01-01', 'value1|value2' union all
    select 3, '2017-01-01', 'value1') as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    SELECT  date,fval as allValue,count(fval) as ValueCount from
    (select date,fval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a
    
    union all
    
    select date,sval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable as a)as a) as a
    
    UNION all
    
    
    select date,tval from
    (select date,SUBSTRING_INDEX(rplace, ' ', 1)fval,SUBSTRING_INDEX(MID(rplace,8,LENGTH(rplace)), ' ', 1)sval,SUBSTRING_INDEX(MID(rplace,15,LENGTH(rplace)), ' ', 1)tval from
    (select id,  date, valuelist,REPLACE(valuelist,'|',' ') as rplace from
    (select * from yourTable) as a)as a) as a) as a
    where fval !='' GROUP BY fval,date
    
    2017-01-01  value1  3
    2017-01-01  value2  2
    2017-01-01  value3  1
    

    欢迎来到堆栈溢出!您似乎在要求某人为您编写一些代码。堆栈溢出是一个问答网站,而不是代码编写服务。请阅读并学习如何写有效的问题。在询问之前,一定要明确,并尽最大努力。在这种情况下,您应该添加PHP@NetBlues你的价值清单中有真实的样本值吗?我编辑了你的问题,因为当你提到一个数字时,我会把它重命名为结果。但你拒绝了。如果你愿意,就创建一个过程。谢谢你的关注。这似乎仅在值的长度为6个字符时有效。但是,活动字段中的真值可能在1到16个字符之间。