逐个语句的非相关值

时间:2014-08-15 22:52:46

标签: 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`

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

问题是“value_old”和“value_new”总是取每个日期的第一个值,而不是与“action”的最大值对应的值

2 个答案:

答案 0 :(得分:0)

我不知道这是怎么回事。这就是SQL的工作原理 - order by发生在 group by之后的。此外,MySQL只会让您感到困惑,因为您使用的group by扩展程序并不完全了解 - select中的额外列不在group by中。 (见this。)

幸运的是,MySQL支持hack来获得你想要的东西,而无需编写更复杂的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)

答案 1 :(得分:0)

找到另一种方法。我使用"创建了"列获取最大值并加入:

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