Сначала ваш второй запрос (все идентификаторы, которые содержат категорию 3) не требует объединения с x1
(обратите внимание, как вы вообще его не используете):
SELECT DISTINCT
e1.id
FROM
many_to_many e1
WHERE
e1.category IN (3)
Затем ваш первыйзапрос может быть упрощен:
SELECT DISTINCT
category
FROM
many_to_many e1
WHERE id IN
(
SELECT DISTINCT
e1.id
FROM
many_to_many e1
WHERE
e1.category IN (3)
)
Решение
Однако вместо использования подзапроса, который вы можете просто присоединить, что обычно более эффективно, чем подзапрос:
SELECT DISTINCT e2.category
FROM many_to_many e1
LEFT JOIN many_to_many e2 ON e1.id=e2.id
WHERE e1.category IN (3);
Это присоединяет many_to_many
к себе на id
, что формирует все комбинации категорий для каждого id
.В частности, будет строка (3,i)
для всех других категорий i
, которые отображаются в том же id
.
Если вы не хотите, чтобы 3 были включены, измените LEFT JOIN
на:
LEFT JOIN many_to_may e2 ON e1.id=e2.id AND e1.category<>e2.category