Mysql GROUPBY语句上的非相关值
帮助我使用下一个SQL:Mysql GROUPBY语句上的非相关值,mysql,Mysql,帮助我使用下一个SQL: SELECT date_format(from_unixtime(`ticket_logs`.`created`),'%Y-%m-%d') AS `datac`, `ticket_logs`.`ticket_id` AS `ticket_id`, ticket_logs.value_old, ticket_logs.value_new, max(`ticket_logs`.`action`) AS `ultima_act` FR
SELECT
date_format(from_unixtime(`ticket_logs`.`created`),'%Y-%m-%d') AS `datac`,
`ticket_logs`.`ticket_id` AS `ticket_id`,
ticket_logs.value_old,
ticket_logs.value_new,
max(`ticket_logs`.`action`) AS `ultima_act`
FROM
`ticket_logs`
WHERE
(
(`ticket_logs`.`action` = 6)
OR (`ticket_logs`.`action` = 16)
)
GROUP BY
date_format(
from_unixtime(`ticket_logs`.`created`),
'%Y-%m-%d'
),
`ticket_logs`.`ticket_id`
ORDER BY
`datac` DESC,
`ticket_logs`.`ticket_id` DESC
问题是“旧值”和“新值”总是取每个日期的第一个值,而不是与“操作”的最大值对应的值。我不认为这是一个问题。这就是SQL的工作原理——
orderby
发生在groupby
之后。此外,MySQL让您感到困惑,因为您使用的是一个扩展名groupby
,您并不完全理解它——在select
中有额外的列,而这些列不在groupby
中。(见附件。)
幸运的是,MySQL支持黑客获取您想要的内容,而无需编写更复杂的SQL语句。您需要的表达式是:
substring_index(group_concat(ticket_logs.value_old order by `ticket_logs`.`action` desc), ',', 1)
substring_index(group_concat(ticket_logs.value_new order by `ticket_logs`.`action` desc), ',', 1)
找到了另一种方法。我使用“已创建”列获得最大值并加入:
SELECT
date_format(
from_unixtime(`ticket_logs`.`created`),
'%Y-%m-%d'
) AS `datax`,
ticket_logs.ticket_id,
ticket_logs.action,
ticket_logs.value_old,
ticket_logs.value_new
FROM
ticket_logs
INNER JOIN (
SELECT
date_format(
from_unixtime(`ticket_logs`.`created`),
'%Y-%m-%d'
) AS `datac`,
max(ticket_logs.created) AS maxts,
ticket_id
FROM
ticket_logs
WHERE
ticket_logs.action = 6
OR ticket_logs.action = 16
GROUP BY
date_format(
from_unixtime(`ticket_logs`.`created`),
'%Y-%m-%d'
),
ticket_id
) maxtbl ON ticket_logs.ticket_id = maxtbl.ticket_id
AND ticket_logs.created = maxtbl.maxts
ORDER BY
datax DESC,
ticket_id DESC
是的,谢谢!我发现了一些内部连接示例,但似乎不适合我的问题。我来测试你的解决方案。祝你一切顺利
MAX(created)
与问题中指定的“最大行动价值”不同。是的,我知道这不是我最初问题的答案。这是另一种在一天结束时发现价值的方法。它在我的环境中起作用。