Не используйте group by
для фильтрации данных.Вот для чего where
.В этом случае используйте коррелированный подзапрос:
SELECT t1.*
FROM tbl1 t1
WHERE t1.value IN (1, 3, 6) AND
t1.value = (SELECT MIN(tt1.value) FROM tbl1 tt1 WHERE tt1.item = t1.item AND tt1.value IN (1, 3, 6));
При разумных показателях приведенное выше должно быть достаточно быстрым.Обратите внимание, что фильтрация на value
во внешнем запросе не требуется.
Для производительности я бы сформулировал это следующим образом:
SELECT t1.*
FROM tbl1 t1
WHERE t1.id = (SELECT tt1.id
FROM tbl1 tt1
WHERE tt1.item = t1.item AND
tt1.value IN (1, 3, 6)
ORDER BY tt1.value
LIMIT 1
);
В этом запросе предполагается, что tbl1(id)
является основнымключ (кажется разумным предположением).Тогда вы хотите индекс на tbl1(tt1, item, value, id)
.