2014-09-22 46 views
1

我有一个基于PHP/MySQL的解决方案,用于显示ID和ID在过去一天和今年的MySQL数据库表中的条目数。 这些信息只是输出到表格中。加入最近的列条目到MySQL查询结果

我们也能够快速查看与该表上每个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 | 

我只需在表格中添加与每个标签匹配的Battery的最新价值即可。我一直在尝试一整个早上来产生这个结果,但我没有任何运气。

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

我不是MySQL专家,开始觉得查询过于混乱。我很难弄清楚如何获得这种电池价值。

我应该如何获取Battery的最新条目并将其匹配到正确的行? 有没有办法在1(也许更干净)的查询中做到这一切,或者我应该做2个查询并将电池列与标签列相匹配?

+0

您需要加入包含最新电池(如SELECT MAX(timestamp),电池GROUP BY battery')的子查询。这是一般想法,可能无法正常工作。 – Mihai 2014-09-22 17:36:17

回答

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柱看起来不正确的,因为它来自一个不确定行。

+1

对于Mysql,这是一个很棒的把戏+1 – 2014-09-22 17:40:13

+0

不错的解决方案!欣赏它 – lrich 2014-09-22 17:49:02