我有一个基于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列匹配?
答案 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
列看起来不正确,因为它来自不确定的行。