将最新的列条目加入MySQL查询结果

时间:2014-09-22 17:33:31

标签: php mysql sql database

我有一个基于PHP / MySQL的解决方案,用于显示过去一天和年初ID在MySQL数据库表上的ID和条目数。 信息只输出到表格。

我们还可以快速查看与同一个表中每个ID关联的特定列的最新值。

使用中的表格有以下描述:

TABLE: tags
id        int    auto_increment
Tag       int(8)
Timestamp timestamp
Battery   varchar(3)             // Status for rfid tags battery condition

TABLE: tag_vehicle
id        int     auto_increment
Tag       int(8)
VehicleId varchar(10)

这是我的MySQL查询

SELECT tags.Tag, 
sum(CASE WHEN year(Timestamp) = year(CURDATE()) then 1 else 0 end) as ytd,
sum(CASE WHEN date(Timestamp) = date(CURDATE()) then 1 else 0 end) as today,
tag_vehicle.VehicleId, 
MAX(Timestamp) as latest
FROM tags
INNER JOIN tag_vehicle 
ON tags.Tag = tag_vehicle.Tag
GROUP BY VehicleNumber;

这会生成一个包含这些列的表

| Tag | ytd | today | VehicleId | Timestamp  |
|1234 | 300 |  12   |  BUS1234  | 2014-09-22 |  

我只是想在我的表格中添加与每个标签相匹配的最新电池值。我整个上午都在尝试产生这个结果,但我没有运气。

| Tag | ytd | today | VehicleId | Timestamp  | Battery |
|1234 | 300 |  12   |  BUS1234  | 2014-09-22 |   ok    |

我不是MySQL的专家,它开始觉得查询太乱了。我很难弄清楚如何获得这个电池价值。

我应该如何获得最新的电池条目并将其与右侧相匹配? 有没有办法在1(可能更干净)的查询中完成所有操作,或者我应该进行2次查询并将Battery列与Tag列匹配?

1 个答案:

答案 0 :(得分:2)

您应该可以使用substring_index() / group_concat()技巧:

执行此操作
SELECT t.tag,
       sum(CASE WHEN year(Timestamp) = year(CURDATE()) then 1 else 0 end) as ytd,
       sum(CASE WHEN date(Timestamp) = date(CURDATE()) then 1 else 0 end) as today,
       tv.VehicleId, 
       MAX(Timestamp) as latest,
       substring_index(group_concat(t.battery order by t.timestamp desc), ',', 1)
FROM tags t INNER JOIN
     tag_vehicle  tv
     ON t.Tag = tv.Tag
GROUP BY VehicleNumber;

tag列看起来不正确,因为它来自不确定的行。