2014-12-04 223 views
0

在任何人评论之前,我没有用逗号分隔值设计这个数据库:) 我花了时间试图找到答案,但我能找到的所有东西都是GROUP_CONCAT(),它似乎做了与我想要的相反。MySQL GROUP BY每个逗号分隔值

我想GROUP BY中的每个逗号分隔值域中的值。

SELECT round(avg(DATEDIFF(dateClosed , dateAded) * 1.0), 2) AS avg, department 
FROM tickets GROUP BY assignedto 

的assignedto字段是逗号分隔值字段

row1 54,69,555 
row2 54,75,555 
row3 75,555 

期望的输出:平均圆形图形为在分组assignedto字段的每个值。

编辑 - 尝试将此项纳入下一级别: 我想包含机票答案表以获得该机票的第一个响应,使用其datetime字段计算出每个用户的平均响应时间。

SELECT a.id as theuser, round(avg(DATEDIFF(ta.dateAded , t.dateAded) * 1.0), 2) as avg 
FROM tickets t join 
    mdl_user a 
    on find_in_set(a.id, t.assignedto) > 0 
INNER JOIN (SELECT MIN(ta.dateAded) as started FROM ticketanswer GROUP BY ta.ticketId) ta ON t.id = ta.ticketId 
GROUP BY a.id ORDER BY avg ASC 
+0

你的问题不是很清楚。尝试张贴您的票据表的一些样本数据和所需的输出数据。 – 2014-12-04 11:50:12

+1

将csv('assingnto')转换回行吗? [11100501 /分逗号分隔值从 - 一列对2-行-内式结果的MySQL的](https://stackoverflow.com/questions/11100501/split-comma-separated-值从一列到二行的结果mysql) – 2014-12-04 11:57:55

+0

创建一个包含票证ID和单个值的表格。如果门票持有修改时间,那也是。 [用于分割字符串,请参阅此处](http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/)。把事情简单化。 – 2014-12-04 12:05:43

回答

2

Yuck。你可以这样做,假设你知道分配的最大数量。下面是一个方法:

select substring_index(substring_index(assignedto, ',', n.n), ',', -1) as assignedto, 
     round(avg(DATEDIFF(dateClosed , dateAded) * 1.0), 2) as avg 
from tickets t join 
    (select 1 as n union all select 2 union all select 3) 
    on length(assignedto) - length(replace(assignedto, ',', '')) < n.n 
group by substring_index(substring_index(assignedto, ',', n.n), ',', -1); 

或者,更简单的方法,如果您有指定值的列表,说在AssignedTo表:

select a.assignedto, round(avg(DATEDIFF(dateClosed , dateAded) * 1.0), 2) as avg 
from tickets t join 
    assignedto a 
    on find_in_set(a.assignedto, t.assignedto) > 0 
group by a.assignedto; 

对不起,你必须处理这个畸形数据库结构。

+0

非常好,非常感谢。我用第二个,因为我有一个用户表加入到 – Codded 2014-12-04 12:32:04

+0

请看我的编辑有你的想法? – Codded 2014-12-04 12:56:03

+0

@Codded。 。 。你应该问这是另一个问题,而不是对已经回答的问题的编辑。 – 2014-12-04 13:00:47