Случай реляционного деления . См .:
Этот запрос обычно более эффективен , чем было предложено до сих пор:
SELECT id
FROM (SELECT id FROM tbl WHERE name = 'value1' AND value = 1) t1
JOIN (SELECT id FROM tbl WHERE name = 'value2' AND value = 2) t2 USING (id);
Или эквивалент (результат идентичный план запроса):
SELECT id
FROM tbl t1
JOIN tbl t2 USING (id)
WHERE t1.name = 'value1' AND t1.value = 1
AND t2.name = 'value2' AND t2.value = 2;
db <> fiddle здесь
Не обеспечивает уникальность в запросе (как это делают другие ответы), поскольку я предполагаю, что одно или несколько ограничений в таблице уже делают это.
Имейте «покрывающий» индекс для (name, value, id)
. Возможны оптимизированные варианты индекса, в зависимости от вашего нераскрытого определения таблицы.
Но сначала пересмотрите свой реляционный дизайн, если вы в состоянии изменить его. Модели EAV обычно неоптимальны. См .: