Mysql 如何避免组_CONCAT()行乘以我的总和()

Mysql 如何避免组_CONCAT()行乘以我的总和(),mysql,sql,Mysql,Sql,因此,我有一个查询谁检索支持票证,并使用GROUP\u CONCAT()im检索一行上的每个票证状态,以在PHP中作为数组进行处理 我的问题是,在查询中,我有一个SUM()从他的干预中获取每张票据的时间支出,但是,例如,如果GROUP\u CONCAT()检索12个状态,票据总和为2400秒,SUM()的最终结果为2400 x 12=28800 我的问题是: SELECT t.subject as theme, SUM(fd.duree) as time, t.datec, t.date_clo

因此,我有一个查询谁检索支持票证,并使用
GROUP\u CONCAT()
im检索一行上的每个票证状态,以在PHP中作为数组进行处理

我的问题是,在查询中,我有一个
SUM()
从他的干预中获取每张票据的时间支出,但是,例如,如果
GROUP\u 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个状态

如果我也按状态分组,你可以看到时间很好,但我只需要一行,其中包含ticket real time expent和他的状态

我的问题是,如何避免
GROUP_CONCAT()
行不乘以我的
SUM()


*编辑:我通过除以
总和(fd.duree)/COUNT(DISTINCT tl.rowid)
来实现它。我知道这是一个奇怪的修复,但不知道如何否则。如果有人有任何建议,我将不胜感激。谢谢

Hi@Roms,我认为时间上28800的值,不是因为Group_Concat函数,而是因为你在上面使用了SUM()。它基本上会将该组的“时间”列中的所有值相加并显示出来。如果希望通过在最终结果中显示2400来保持时间常数,可以将SUM(fd.duree)替换为time,将MAX(fd.duree)替换为time。这应该可以解决它。如果有帮助,请告诉我。@MayankPorwal谢谢你的回答。情况是,
SUM(fd.duree)
是票据的每个干预的总和(一张票据可以有一个或多个干预)。时间列不直接在票证表上。这就是做
SUM()
的要点。如果我做了
MAX()
,当2400是正确的数字时,我有1200,因为这张票有2个干预。如果在查询中我删除了
GROUP\u CONCAT()
列,结果很好(2400),但我需要票证状态。将GROUP\u CONCAT推到子查询中。@P.Salmon感谢您的回答。你到底是什么意思,推进到一个子查询?在第一个
选择中查询
选择
?谢谢。谢谢,但仍然获得第一张图中显示的实时*状态行数(28800):/好的,如果删除表S、U和更重要的TL的连接,会怎么样?是的,现在正在工作!谢谢因此,将
JOIN
移动到
SELECT
子查询中可以很好地工作,而无需将每个
GROUP\u CONCAT
行的聚合函数相乘。
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