Соединение одной таблицы с последней строкой в ​​другой таблице с использованием MySQL - PullRequest
1 голос
/ 12 апреля 2011

Я хочу соединить две таблицы особым образом, первая таблица - devices , в которой есть список устройств.

Вторая таблица - это журнал данных , в котором хранится множество данных для каждого опрашиваемого устройства в устройствах .

Таблица устройств:

+----------+------------+----------------------------+---------------------+
| deviceId | deviceName | deviceDescription          | timeCreated         |
+----------+------------+----------------------------+---------------------+
|        1 | System 1   | Main System in Server Room | 2010-01-01 00:00:00 |
|        2 | System 2   | Outdoor System             | 2010-01-01 00:00:00 |
+----------+------------+----------------------------+---------------------+

Таблица данных журнала:

+----+---------------------+----------+-----------+---------+
| id | time_stamp          | DeviceId | FuelLevel | Voltage |
+----+---------------------+----------+-----------+---------+
|  1 | 2010-01-01 00:00:00 |        1 |        60 |     220 |
|  2 | 2010-01-01 00:00:00 |        2 |        20 |     221 |
|  3 | 2010-01-02 00:00:00 |        1 |       100 |     219 |
|  4 | 2010-01-02 00:00:00 |        2 |       100 |     222 |
|  5 | 2010-01-03 00:00:00 |        1 |        80 |     219 |
|  6 | 2010-01-03 00:00:00 |        2 |        99 |     220 |
+----+---------------------+----------+-----------+---------+

В настоящее время я получаю последние данные для каждого устройства, используя запрос к таблице DataLog с:

 Where DeviceId = 1 ORDER BY timestamp DESC LIMIT 1

Мне бы хотелось, чтобы одним запросом был возвращен список всех устройств со столбцами, объединенными с самыми последними данными для каждого устройства, например:

+----------+------------+----------------------------+---------------------+-----------+---------+
| deviceId | deviceName | deviceDescription          | time_stamp          |FuelLevel  | Voltage |
+----------+------------+----------------------------+---------------------+-----------+---------+
|        1 | System 1   | Main System in Server Room | 2010-01-03 00:00:00 |        80 |     219 |
|        2 | System 2   | Outdoor System             | 2010-01-03 00:00:00 |       99  |     220 |
+----------+------------+----------------------------+---------------------+-----------+---------+

Ответы [ 4 ]

3 голосов
/ 12 апреля 2011

Вы не можете сделать «предел 1» на внешнем уровне, вы теряете то, что ищете ... ВСЕ устройства последней записи. Используйте предварительный запрос для последнего идентификатора каждого устройства, затем присоединитесь обратно ...

select 
        Devices.*,
        DataLog.Time_Stamp,
        DataLog.FuelLevel,
        DataLog.Voltage
    from
        ( select DeviceID,
                 max( ID ) LastActionID
              from
                 DataLog
              group by 
                 1 ) LastInstance
        join DataLog
            on LastInstance.LastActionID = DataLog.ID
        join Devices 
            on LastInstance.DeviceID = Devices.DeviceID
   order by 
       Devices.DeviceName

За ваш последний комментарий я бы на самом деле изменился на что-то вроде ...

Обновите таблицу устройств с помощью «LastLogID». Затем с помощью триггера вставьте в свою таблицу DataLog, немедленно обновите таблицу Device с этим новым идентификатором ... Таким образом, вам никогда не нужно предварительно запрашивать журнал данных напрямую. У вас уже будет последний идентификатор и вы запустите от этого непосредственно к журналу данных, соединенному этим идентификатором.

1 голос
/ 12 апреля 2011

Я знаю, что это ужасно, не элегантно и отнимает много времени, но этот запрос работает:

SELECT deviceId,deviceName,deviceDescription,
  (SELECT time_stamp FROM datalog
    WHERE datalog.DeviceId=devices.deviceId
    ORDER BY time_stamp DESC LIMIT 0,1) time_stamp,
  (SELECT FuelLevel FROM datalog
    WHERE datalog.DeviceId=devices.deviceId
    ORDER BY time_stamp DESC LIMIT 0,1) FuelLevel,
  (SELECT Voltage FROM datalog
    WHERE datalog.DeviceId=devices.deviceId
    ORDER BY time_stamp DESC LIMIT 0,1) Voltage
FROM devices

Я пытался создать один подзапрос для извлечения нескольких столбцов, но MySql жалуется, потому что ему нужен только один столбец.

0 голосов
/ 12 апреля 2011

попробуйте

, кстати, если вам нужна только последняя строка, вы можете найти ее по полю автоинкремента (datalog_table.id)

SELECT dvc.deviceId,dvc.deviceName,dvc.deviceDescription,
       dtl.time_stamp,dtl.FuelLevel,dtl.Voltage 
FROM  device_table dvc
INNER JOIN datalog_table dtl
ON dtl.DeviceId=dvc.deviceId
ORDER BY dtl.id  LIMIT 1
0 голосов
/ 12 апреля 2011
  SELECT
  d.deviceId, d.deviceName, d.deviceDescription, 
  dl.time_stamp, dl.FuelLevel, dl.Voltage 
  FROM Device d, DataLog dl 
  WHERE d.deviceId=dl.deviceID 
  ORDER BY time_stamp DESC
  LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...