Таким образом, у меня есть запрос, который извлекает билеты поддержки и с помощью GROUP_CONCAT()
im извлекает каждый статус билета в одной строке, чтобы выполнить PHP в качестве массива.
Моя проблема заключается в том, что по запросу у меня есть SUM()
чтобы получить время на каждый билет из его интервенций, но, например, если GROUP_CONCAT()
извлекает 12 статусов, а суммирование суммы составляет 2400 секунд, конечный результат SUM()
2400 x 12 = 28800.
Вот мой запрос:
SELECT t.subject as theme, SUM(fd.duree) as time, t.datec, t.date_close, t.category_code as category, GROUP_CONCAT(DISTINCT IFNULL(tl.status, 0),'_',tl.datec ORDER BY tl.datec) as status
FROM llx_ticketsup as t
JOIN llx_societe as s on s.rowid = t.fk_soc
JOIN llx_user as u on u.rowid = t.fk_user_assign
JOIN llx_element_element as ee on ee.fk_source = t.rowid
JOIN llx_fichinter as f on f.rowid = ee.fk_target
JOIN llx_fichinterdet as fd on fd.fk_fichinter = f.rowid
JOIN llx_ticketsup_logs as tl on tl.fk_track_id = t.track_id
WHERE t.fk_statut = 8
AND t.fk_soc = 165
AND (STR_TO_DATE(t.date_close, '%Y-%m-%d') BETWEEN '2018-06-25' AND '2018-06-25 23:59:59')
GROUP BY t.rowid
Результат:
Он должен иметь 2400 вовремя, но умножается на 12 его статусов.
Если я группирую по статусам тоже, время хорошо, как вы можете видеть, но мне нужна только одна строка с расширением реального времени в билете и конкатенацией его статусов.
Мой вопрос: как избежать строк GROUP_CONCAT()
чтобы не умножать мой SUM()
?
* EDIT: я сделал это, разделив SUM(fd.duree)/COUNT(DISTINCT tl.rowid)
. Я знаю, что это странное решение, но не знаю, как это сделать. Если у кого-нибудь есть какое-то предложение, он это оценит. Спасибо!
SELECT t.subject as theme,
SUM(fd.duree) as time,
t.datec, t.date_close,
t.category_code as category,
(SELECT GROUP_CONCAT(DISTINCT COALESCE(l.status, 0),'_',l.datec ORDER BY l.datec)
FROM llx_ticketsup_logs AS l WHERE fk_track_id = t.track_id) as status
FROM llx_ticketsup as t
JOIN llx_element_element as ee on ee.fk_source = t.rowid
JOIN llx_fichinter as f on f.rowid = ee.fk_target
JOIN llx_fichinterdet as fd on fd.fk_fichinter = f.rowid
WHERE t.fk_statut = 8
AND t.fk_soc = 165
AND (STR_TO_DATE(t.date_close, '%Y-%m-%d') BETWEEN '2018-06-25' AND '2018-06-25 23:59:59')
GROUP BY t.rowid
SUM(fd.duree)
является суммой каждого вмешательства в билете (один билет может иметь одно или несколько вмешательств). Столбец времени не находится непосредственно в таблице билетов. Так вот в чем смысл делатьSUM()
. Если я выполняюMAX()
, у меня 1200, когда 2400 - правильный номер, потому что в этом билете 2 вмешательства. Если в запросе я удаляю столбецGROUP_CONCAT()
, результат будет хорошим (2400), но мне нужны статусы заявок.