Remmi
@Remmi

Как в MySQL организовать запрос по нескольким вариантам для критерия?

Добрый вечер. Вопрос простой, но меня поставил в тупик

Есть таблица с тремя колонками:
1. ID - идентификатор записи
2. FK_ID - идентификатор для внешнего ключа
3. VALUE - значение записи

Есть набор внешних ключей (FK_ID), например: [2, 4, 5], для которых нужно получить самые актуальные значения - с наибольшим идентификатором. Например, для исходной таблицы со значениями:

id | fk_id | value
1 | 1 | 15
2 | 2 | 666
3 | 1 | 6
4 | 3 | 7
5 | 3 | 1
6 | 4 | 14
7 | 5 | 15
8 | 2 | 10
9 | 4 | 1

Результат будет следующий:
id | fk_id | value
8 | 2 | 10
9 | 4 | 1
7 | 5 | 15

Можно ли это сделать в одном запросе, или придётся делить на несколько отдельных, по количеству ключей для поиска? Если можно, то как и будет ли этот вариант быстрее, чем отдельные запросы?

Заранее спасибо за ответы.
  • Вопрос задан
  • 2532 просмотра
Решения вопроса 2
egor_nullptr
@egor_nullptr
select t1.*
from tt as t1
inner join (
    select max(id) as max_id
    from tt
    where fk_id in (2,4,5)
    group by fk_id
) as t2 on t1.id = t2.max_id
order by fk_id;
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Поскольку определять нужно по уникальному полю, то можно так:
select v.id, v.fk_id, v.value from `table` as v join (
select fk_id, max(id) as id from `table` where fk_id in (2,4,5) group by fk_id
) targetids using(id)


Хм, долго пишу.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Remmi
@Remmi Автор вопроса
Спасибо за ответы!

В анализе SQL запросы выглядят идентично. Проверил оба варианта на таблице с 301977 записями. Результаты такие:
Минимальное время выполнения: @egor_nullptr - 0.1982, @Melkij - 0.2028
Максимальное время выполнения: @egor_nullptr - 0.5384, @Melkij - 0.5366
Среднее время: @egor_nullptr - 0.30854, @Melkij - 0.30861

Из чего могу сделать предположение, что оба варианта работают по одинаковому механизму со слегка разной реализацией.

Вопрос решён.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы