2014-09-22 4 views
1

У меня есть решение на основе PHP/MySQL для отображения идентификатора и количества записей, которые ID имеет в таблице базы данных MySQL за последний день и год до настоящего времени. Информация просто выводится на таблицу.Объединение последней записи столбца в результат запроса MySQL

Мы также смогли бы быстро увидеть самое последнее значение для конкретного столбца, связанного с каждым идентификатором в этой же таблице.

Таблицы использования имеют следующие описания:

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, и его начало ощущаться, что запрос слишком запутан. Мне сложно понять, как получить эту стоимость батареи.

Как я могу получить последнюю информацию о батарее и сопоставить ее с правой строкой? Есть ли способ сделать все это в 1 (возможно, более чистом) запросе, или мне нужно сделать 2 запроса и сопоставить столбцы Battery столбцам с тегами?

+0

Вам нужно ПРИСОЕДИНЯЙТЕСЬ в подзапрос, содержащий последнюю батарею, такую ​​как 'SELECT MAX (timestamp), батарея GROUP BY battery' Это общая идея, возможно, не работает точно так, как есть. – Mihai

ответ

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 –

+0

Отличное решение! Ценить это – lrich

Смежные вопросы