2014-12-04 3 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 сгруппированных.

EDIT - ПЫТАЯ ПРИНИМАТЬ ЭТО НА СЛЕДУЮЩИЙ УРОВЕНЬ: Я хочу включить таблицу ответов на билет, чтобы получить первый ответ на этот билет, используйте поле 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

Ваш вопрос не очень ясен. Попытайтесь отправить по некоторым образцовым данным вашей таблицы билетов и желаемым выходным данным, пожалуйста. –

+1

Преобразуйте csv's ('assingnto') обратно в строки? [11100501/расщепленным разделенного запятыми-значение из-один-к-колонки-2-строка-в-результаты MySQL] (https://stackoverflow.com/questions/11100501/split-comma-separated- значения-from-one-column-to-2-rows-in-the-results-mysql) –

+0

Создайте таблицу с идентификатором билетов и отдельными значениями. Если билеты имеют время модификации, то и одно. [Для разделения строки см. Здесь] (http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/). Будь проще. –

ответ

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

+0

. Пожалуйста, см. Мое редактирование, есть ли у вас какие-либо идеи? – Codded

+0

@Codded. , , Вы должны задать это как другой вопрос, а не как отредактировать уже ответивший вопрос. –