Mysql 选择每个ID的最大日期

Mysql 选择每个ID的最大日期,mysql,join,max,greatest-n-per-group,Mysql,Join,Max,Greatest N Per Group,我有两个名字叫“tipo_hh”和“tipo_hh_historial” 我需要在两个表之间建立一个连接,其中“id”在两个表中是相同的。 但我需要为表“tipo_hh”中的每个“id”选择表“tipo_hh_historial”中的“valor”,条件是记录“fecha_cambio”和“hora_cambio”的最大值 “id”是表“tipo_hh”中的主键和自动增量 像这样的 这是“tipo_hh”表 这是“tipo_hh_historial”表 我需要这个: id nombre

我有两个名字叫“tipo_hh”和“tipo_hh_historial”

我需要在两个表之间建立一个连接,其中“id”在两个表中是相同的。 但我需要为表“tipo_hh”中的每个“id”选择表“tipo_hh_historial”中的“valor”,条件是记录“fecha_cambio”和“hora_cambio”的最大值

“id”是表“tipo_hh”中的主键和自动增量

像这样的

这是“tipo_hh”表

这是“tipo_hh_historial”表

我需要这个:

id  nombre     valor
1   Reefer     2.50
2   Lavados    3.00
3   Dry        5.00
4   Despacho   1.50
试试这个:

SELECT A.id, B.nombre, A.valor, MAX(A.hora_cambio) AS hora_cambio_time
FROM tipo_hh_historial AS A
INNER JOIN tipo_hh AS B
ON(A.id = B.id)
GROUP BY A.id

首先,您应该为列使用适当的数据类型,如日期。在示例数据集中,应该有一列与时间列类型相同的数据,您的日期格式为
'%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)
您的问题似乎就是这个问题,因此您可以首先从表
tipo_hh_historial
maxima of
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)

使用子查询获取每个id的历史记录的最大日期/时间,并使用该查询获取最新历史记录的其余部分:-

SELECT tipo_hh.id, tipo_hh.nombre, tipo_hh_historial.valor
FROM tipo_hh
INNER JOIN 
(
    SELECT id, MAX(STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s')) AS MaxDateTime
    FROM tipo_hh_historial
    GROUP BY id
) Sub1
ON tipo_hh.id = Sub1.id
INNER JOIN tipo_hh_historial
ON tipo_hh_historial.id = Sub1.id
AND STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s') = Sub1.MaxDateTime
SQL Fiddle:-


请查看答案并接受…谢谢!。。。但这不是我需要的。。因为我需要为每个“id”选择最大值“hora_cambio”和“fecha_cambio”的同一行中的“valor”值,谢谢!。。。但这不是我需要的。。因为我需要为每个“id”在最大“hora_cambio”和“fecha_cambio”的同一行中选择“valor”的值,谢谢您的回复。。。我已经解决了我的问题。。。我用这篇文章来解决我的问题。。。。我忘了注意这个问题中的日期字段。。。但我在表中使用了日期数据类型。。。你为这两种情况提出了解决方案。非常感谢你的努力。。。我将代表我的50人感谢你的回应和努力。。再次感谢…恐怕这个sql中有一个bug。如果一个id的最大hora_cambio不在最大fecha_cambio上,那么它将丢失该id的值id@Kickstart当我在用同样的逻辑来解决你的问题时,你发布了答案。完全同意您的观点,使用一个datetime字段会更好。@选民愿意解释您在答案中发现的错误
ON (
th.`id` =thh.`id` 
AND th.fecha_cambio=thh.`fecha_cambio` 
AND th.hora_cambio = thh.`hora_cambio`
)
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)
SELECT tipo_hh.id, tipo_hh.nombre, tipo_hh_historial.valor
FROM tipo_hh
INNER JOIN 
(
    SELECT id, MAX(STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s')) AS MaxDateTime
    FROM tipo_hh_historial
    GROUP BY id
) Sub1
ON tipo_hh.id = Sub1.id
INNER JOIN tipo_hh_historial
ON tipo_hh_historial.id = Sub1.id
AND STR_TO_DATE(CONCAT(fecha_cambio, hora_cambio), '%d/%m/%Y%k:%i:%s') = Sub1.MaxDateTime