Получить группу записей по последнему неизвестному id - PullRequest
1 голос
/ 28 мая 2020

У меня есть таблица журнала, в которой я хочу выбрать записи для определенной c группы записей, сгруппированных по неизвестному мне идентификатору.
См. Таблицу ниже, столбцов больше, но они не имеют отношения к вопросу.

-------------------------------------------------------
| id | details    | deviceId | processId | timestamp  |
-------------------------------------------------------
| 1  | startup    | 753      | 538       | 1546346190 |
| 2  | processing | 753      | 538       | 1546346192 |
| 3  | logging    | 753      | 538       | 1546346217 |
| 4  | done       | 753      | 538       | 1546346220 |
| 5  | startup    | 567      | 539       | 1590648690 |
| 6  | processing | 567      | 539       | 1590648692 |
| 7  | logging    | 567      | 539       | 1590648717 |
| 8  | done       | 567      | 539       | 1590648720 |
| 9  | startup    | 753      | 540       | 1590655888 |
| 10 | processing | 753      | 540       | 1590655890 |
| 11 | logging    | 753      | 540       | 1590655915 |
| 12 | email sent | 753      | 540       | 1590655918 |
| 13 | done       | 753      | 540       | 1590655920 |
-------------------------------------------------------

Я хочу получить последние записи одного процесса для одного устройства
Когда я запрашиваю что-то вроде этого, я получаю все записи устройства:

SELECT *
FROM logtable
WHERE deviceId = 753
ORDER BY timestamp DESC

Как я могу получить записи с processId 540 в одном запросе, если я не знаю, что processId равен 540?

Я уже пробовал это с подзапросом:

SELECT *
FROM logtable
WHERE processId IN (
   SELECT processId
   FROM logtable
   WHERE deviceId = 753
   ORDER BY timestamp DESC
   LIMIT 1
)

Но MariaDB не принимает LIMIT в подзапросе

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Кстати, это самый часто задаваемый вопрос по этому тегу. Стандартное решение выглядит следующим образом:

SELECT x.*
  FROM logtable x
  JOIN 
     ( SELECT processId
            , MAX(timestamp) timestamp
         FROM logtable
        WHERE deviceId = 753
        GROUP
           BY processid
     ) y
    ON y.processid = x.processid
   AND y.timestamp = x.timestamp
0 голосов
/ 28 мая 2020

Используйте =:

SELECT l.*
FROM logtable l
WHERE processId = (SELECT l2.processId
                   FROM logtable l2
                   WHERE l2.deviceId = 753
                   ORDER BY l2.timestamp DESC
                   LIMIT 1
                  );

Вам нужно только IN, если подзапрос будет возвращать несколько строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...