Надеюсь, кто-нибудь сможет мне помочь.
Мой запрос
SELECT * FROM `tbl_device`
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID
Результат.
Как можно получить что-то подобное, как показано на фото по ссылке.
Мне нужно получить только последние 3 результата tbl_device.DevID
Я прошу прощения за мой плохой английский, это действительно трудно объяснить. Любая помощь очень ценится.
Большое спасибо!
Это должно быть что-то вроде
SELECT * FROM `tbl_device`
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID
ORDER BY tbl_temperature.DevID DESC
LIMIT 3 OFFSET 0
Столбец заказа может быть не таким, как в моем примере. ОГРАНИЧЕНИЕ ОГРАНИЧЕНИЯ Google MySQL
Или, если вам нужно получить только три последних результата из одной из ваших таблиц, а затем соединить ее с другой, тогда это будет что-то вроде
SELECT * FROM tbl_device INNER JOIN
(SELECT .... FROM other_table ORDER BY your_column DESC LIMIT 3 OFFSET 0) as
T1 ON T1.id = tbl_device.ID
Самый простой способ — использовать стандартные оконные функции ANSI (row_number()
особенно). Но MySQL не поддерживает их (пока).
В MySQL, вероятно, лучше всего использовать переменные:
SELECT . . .
FROM tbl_device d JOIN
(SELECT t.*,
(@rn := if(@d = t.devid, @rn + 1,
if(@d := t.devid, 1, 1)
)
) as rn
FROM (SELECT t.*
FROM tbl_temperature t
ORDER BY DevID, id DESC
) t CROSS JOIN
(SELECT @d := -1, @rn := 0) params
) t
ON tbl_device.ID = tbl_temperature.DevID
WHERE rn <= 3;
РЕДАКТИРОВАТЬ:
Вот более простой способ выразить логику. Это может быть производительным с правильными индексами:
SELECT d.*, t.*
FROM tbl_device d INNER JOIN
tbl_temperature t
ON d.ID = t.DevID
WHERE t.ID >= (SELECT t2.ID
FROM tbl_temperature t2
WHERE t2.DevId = t.DevId
ORDER BY t2.ID DESC
OFFSET 2 LIMIT 1
);
Для производительности, это может использовать индекс на tbl_temperature(devid, id)
,