2014-09-22 76 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