2016-06-08 4 views
0

У меня есть 2 столовых устройства и локации. Мне нужен результат, как последние 5 записей deviceid, где admin id. в формате JSON таблицы, как показано ниже: устройства таблице:mysql запрос для получения последних записей для каждой категории

+-----------------------+ 
    | id |device_id|adminid | 
    +-----------------------+ 
    | 1 |eefdcdfs | admin1 | 
    | 2 |ffsdxwe2 | admin1 | 
    | 3 |aaqw35ds | admin2 | 
    | 4 |grfdr23f | admin2 | 
    | 5 |etdhy79e | admin3 | 
    +-----------------------+ 

места таблице:

+-----------------------------------------------------------------+ 
    | lid|lat  |long  |time    |deviceid |adminid | 
    +----+----------+----------+-------------------+---------+--------+ 
    | 1 |17.4425358|78.3922061|2016-06-08 12:23:24|eefdcdfs | admin1 | 
    | 2 |17.4425358|78.3922061|2016-06-08 12:45:24|eefdcdfs | admin1 | 
    | 3 |17.4425358|78.3922061|2016-06-08 11:56:24|eefdcdfs | admin1 | 
    | 4 |17.4425358|78.3922061|2016-06-08 12:53:24|eefdcdfs | admin1 | 
    | 5 |17.4425500|78.3922342|2016-06-08 12:53:34|ffsdxwe2 | admin1 | 
    | 6 |17.4425342|78.3922546|2016-06-08 11:55:34|ffsdxwe2 | admin1 | 
    | 7 |17.4425562|78.3922657|2016-06-08 12:23:34|ffsdxwe2 | admin1 | 
    | 8 |17.4425223|78.3922675|2016-06-08 12:12:34|ffsdxwe2 | admin1 | 
    | 9 |17.4424856|78.3922307|2016-06-08 12:56:48|aaqw35ds | admin2 | 
    | 10 |17.4425453|78.3922087|2016-06-08 13:08:30|grfdr23f | admin2 | 
    | 11 |17.4425472|78.3922294|2016-06-08 13:15:54|etdhy79e | admin3 | 
    +----+----------+----------+-------------------+---------+--------+ 

ожидаемый результат:

+-----------------------------------------------------------------+ 
    | lid|lat  |long  |time    |deviceid |adminid | 
    +----+----------+----------+-------------------+---------+--------+ 
    | 4 |17.4425358|78.3922061|2016-06-08 12:53:24|eefdcdfs | admin1 | 
    | 2 |17.4425358|78.3922061|2016-06-08 12:45:24|eefdcdfs | admin1 | 
    | 1 |17.4425358|78.3922061|2016-06-08 12:23:24|eefdcdfs | admin1 | 
    | 3 |17.4425358|78.3922061|2016-06-08 11:56:24|eefdcdfs | admin1 | 
    | 5 |17.4425500|78.3922342|2016-06-08 12:53:34|ffsdxwe2 | admin1 | 
    | 7 |17.4425562|78.3922657|2016-06-08 12:23:34|ffsdxwe2 | admin1 | 
    | 8 |17.4425223|78.3922675|2016-06-08 12:12:34|ffsdxwe2 | admin1 | 
    | 6 |17.4425342|78.3922546|2016-06-08 11:55:34|ffsdxwe2 | admin1 | 
    +----+----------+----------+-------------------+---------+--------+ 

Я попытался как:

select deviceid,CONCAT('[',CAST(lat AS CHAR),',',CAST(long AS 
    CHAR),'],') json from locations WHERE 
    admin_id='admin1' 
    AND `time` > DATE_SUB(NOW(), 
    INTERVAL 3 HOUR) ORDER BY time DESC limit 10; 
+0

Почему ваш ожидаемый результат d oes не имеют 'deviceid' 'aaqw35ds', 'grfdr23f', 'etdhy79e'? – Blank

ответ

0

Это mysql-запрос, используемый в моей программе. Используйте join, чтобы выполнить две таблицы избежит репликации.

qry=Select distinct * from tbl_1 join tbl_2 on tbl_1 .Som_Id =tbl_2 .S_Id order by DATE1"; 

Это пример только для справки. Сделав некоторые изменения, вы сможете добиться своего результата.

0

Один из способов сделать это - использовать переменные. Сделайте дополнительный запрос, чтобы получить возможные строки, которые вас интересуют, упорядоченные по убыванию времени. Добавьте 1 к счетчику для каждого, где идентификатор устройства тот же. Используйте эти результаты в качестве подзапроса и возвращайте те, где счетчик равен 5 или меньше.

Что-то вроде этого: -

SELECT lid, 
    lat, 
    `long`, 
    `time`, 
    deviceid, 
    adminid 
FROM 
(
    SELECT lid, 
     lat, 
     `long`, 
     `time`, 
     deviceid, 
     adminid, 
     @cnt:=IF(@deviceid = deviceid, @cnt + 1, 1) AS cnt, 
     @deviceid := deviceid 
    FROM 
    (
     SELECT locations.lid, 
      locations.lat, 
      locations.`long`, 
      locations.`time`, 
      locations.deviceid, 
      locations.adminid 
     FROM devices 
     INNER JOIN locations 
     ON devices.device_id = locations.deviceid 
     WHERE locations.adminid = 'admin1' 
     AND locations.`time` > DATE_SUB(NOW(), INTERVAL 3 HOUR) 
     ORDER BY locations.deviceid, locations.time DESC 
    ) sub0 
    CROSS JOIN 
    (
     SELECT @cnt:=0, @deviceid:='' 
    ) sub1 
) sub2 
WHERE cnt <= 5 

EDIT

Альтернативой является использование и злоупотребление заявление GROUP_CONCAT получить все времена для каждого устройства, а затем SUBSTRING_INDEX, чтобы получить 5-й раз (если меньше чем в 5 раз, он получит последний, который в этом случае будет прекрасен), а затем присоедините это к вашим таблицам, чтобы получить записи с соответствующими моментами: -

SELECT locations.lid, 
     locations.lat, 
     locations.`long`, 
     locations.`time`, 
     locations.deviceid, 
     locations.adminid 
FROM devices 
INNER JOIN locations 
ON devices.device_id = locations.deviceid 
INNER JOIN  
(
    SELECT locations.deviceid, 
     GROUP_CONCAT(locations.`time` ORDER BY locations.time DESC) AS times 
    FROM devices 
    INNER JOIN locations 
    ON devices.device_id = locations.deviceid 
    WHERE locations.adminid = 'admin1' 
    AND locations.`time` > DATE_SUB(NOW(), INTERVAL 3 HOUR) 
    GROUP BY locations.deviceid 
) sub0 
ON locations.deviceid = sub0.deviceid 
AND locations.`time` >= SUBSTRING_INDEX(SUBSTRING_INDEX(sub0.times, ',', 6), ',', -1) 
WHERE locations.adminid = 'admin1' 
+0

его работает как шарм. спасибо – raavi

+0

@raavi не забывайте отмечать ответы зеленой меткой. Спасибо. [Тур] (http://stackoverflow.com/tour) ... Кикстарту пришлось много работать, чтобы это сделать, я знаю. У вас есть 8 или около того вопросов, ни один из них не отмечен. – Drew

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