Mysql 选择每个ID的最大日期
我有两个名字叫“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”表 我需要这个: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
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 offecha_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