我有以下两个表:
表1 {T1ID,名称}
表2 {T2ID,T1ID,日期,价值}
日期属于DATE类型。
我正在寻找一个SQL查询来为每个名称与特定字符串匹配的T1ID获取最新值(按日期)。
SELECT`Table2`.`T1ID`,
`Table2`.`Value`,
`Table2`.`Date`,
`Table1`.`Name`,
FROM `Table1`
INNER JOIN `Table2` ON `Table2`.`T1ID` = `Table1`.`T1ID`
WHERE `Table1`.`Name` LIKE 'Smith'
但是这会返回相同T1ID的几个日期的值。
如何按日期获取最新值?
编辑: 我正在使用MySQL 5.5.8
答案 0 :(得分:1)
如果我正确地理解了这个问题: 假设MySQL:
SELECT`Table2`.`T1ID`,
`Table2`.`Value`,
`Table2`.`Date`,
`Table1`.`Name`
FROM `Table1`
INNER JOIN `Table2` ON `Table2`.`T1ID` = `Table1`.`ID`,
(SELECT T1ID, MAX(Date) AS 'Date' FROM Table2 GROUP BY T1ID) Table3
WHERE
`Table3`.`T1ID` = `Table2`.`T1ID`
AND
`Table3`.`Date` = `Table2`.`Date`
AND
`Table1`.`Name` LIKE 'Smith'
编辑:更新了代码以恢复正确的结果集。删除了MSSQL的答案,因为它不相关
答案 1 :(得分:1)
您有两种选择。
select t1.t1id, max(t1.Name) Name, max(t2.date) Date,
(select Value from table2 t22
where t22.date = max(t2.date) and t22.t1id = t2.t1id) Value
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id order by 2
OR
select mx.t1id, mx.Name, mx.Date, t2.Value
from
(
select t1.t1id, max(t1.Name) Name, max(t2.date) Date
from table1 t1 left join table2 t2 on t1.t1id = t2.t1id
where Name like '%Smith%'
group by t2.t1id
) mx left join table2 t2 on (t2.t1id = mx.t1id and t2.date = mx.date)
order by 2
两者都会产生相同的结果。第一个代码占用较少的代码,但是您可能会遇到大量数据的性能问题。第二个需要更多的代码,但它也更加优化。关于 JOIN 选项的说明:
修改强>
我错过了其中一个要求,即匹配特定字符串的名称。代码现在已更新。 '%'就像一个通配符,所以它会匹配像'Will Smith'和'Wail Smithers'这样的名字。如果您想要完全匹配,请删除通配符('%')。
答案 2 :(得分:-1)
将其添加到您的SQL:
ORDER BY 'Date' DESC LIMIT 1