SQL查询仅按日期获取最新值

时间:2011-04-04 13:05:47

标签: mysql sql

我有以下两个表:

表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

3 个答案:

答案 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 选项的说明:

  • 如果你进入LEFT JOIN(如示例所示),Table1中没有对应记录的项目将在结果中显示,但Date和Value列中的值将为NULL < / LI>
  • 如果您进入INNER JOIN,表1中没有相应记录的表2中的项目将不会显示

修改

我错过了其中一个要求,即匹配特定字符串的名称。代码现在已更新。 '%'就像一个通配符,所以它会匹配像'Will Smith'和'Wail Smithers'这样的名字。如果您想要完全匹配,请删除通配符('%')。

答案 2 :(得分:-1)

将其添加到您的SQL:

ORDER BY 'Date' DESC LIMIT 1