首先,您应该为您的列使用正确的数据类型,例如日期应该有一列数据类型与您的示例数据集中的时间列相同,您将日期格式化为'%d/%m/%Y'
id 这可以更改为标准格式,'%Y-%m-%d'
这会很好因此,以下查询适用于列的正确类型
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh_new t
JOIN (
SELECT th.*
FROM tipo_hh_historial_new th
JOIN (
SELECT id,valor,
MAX(fecha_cambio ) fecha_cambio
,MAX(hora_cambio) hora_cambio
FROM `tipo_hh_historial_new`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
AND th.hora_cambio = thh.`hora_cambio`
)
) new_tipo_hh_historial
USING (id)
如果您将日期和时间存储为字符串,那么您需要将它们格式化为真实类型,您可以在下面的查询中使用,但不推荐
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh t
JOIN (
SELECT th.*
FROM tipo_hh_historial th
JOIN (
SELECT id,valor,
MAX(STR_TO_DATE(fecha_cambio , '%d/%m/%Y')) fecha_cambio
,MAX(TIME_FORMAT(hora_cambio,'%H:%i:%s')) hora_cambio
FROM `tipo_hh_historial`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND STR_TO_DATE(th.fecha_cambio , '%d/%m/%Y')=thh.`fecha_cambio`
AND TIME_FORMAT(th.hora_cambio,'%H:%i:%s') = thh.`hora_cambio`
)
) new_tipo_hh_historial
USING (id)
您的问题似乎是greatest-n-per-group问题,因此您可以首先从表tipo_hh_historial
最大值中获取最大值,fecha_cambio
并且hora_cambio
需要使用多个条件进行自我连接以获得最大值,例如
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
AND th.hora_cambio = thh.`hora_cambio`
)
然后加入您的第一个表以获得预期的结果
编辑: @Kickstart 发现的问题,他已经回答了,所以我将提供另一种方法来克服。应该有一个字段来存储日期和时间,fecha_cambio DATETIME
这样就不会错过 id 并获得正确的记录日期和时间的最大值。请参阅下面的更新查询
SELECT t.* ,new_tipo_hh_historial.`valor`
FROM tipo_hh_new t
JOIN (
SELECT th.*
FROM tipo_hh_historial_alter th
JOIN (
SELECT id,valor,
MAX(fecha_cambio ) fecha_cambio
FROM `tipo_hh_historial_alter`
GROUP BY id
) thh
ON (
th.`id` =thh.`id`
AND th.fecha_cambio=thh.`fecha_cambio`
)
) new_tipo_hh_historial
USING (id)