mysql внутреннее объединение получает только последние 3 равных

Надеюсь, кто-нибудь сможет мне помочь.

Мой запрос

SELECT * FROM `tbl_device`
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID

Результат.

Результаты запроса

Как можно получить что-то подобное, как показано на фото по ссылке.

tbl_device.DevID

Мне нужно получить только последние 3 результата tbl_device.DevID

Я прошу прощения за мой плохой английский, это действительно трудно объяснить. Любая помощь очень ценится.

Большое спасибо!

0

Решение

Это должно быть что-то вроде

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
1

Другие решения

Самый простой способ — использовать стандартные оконные функции 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),

1