Похоже, вам нужно будет обратиться к исходной таблице дважды, так или иначе.
Я бы порекомендовал не использовать условие IN
, которое не очень масштабируемо и имеет различное интуитивное поведение.
Мой первый вариант использовать коррелированный подзапрос с условием EXISTS
,Обычно это наиболее эффективный способ проверить, существует ли что-то ...
SELECT DISTINCT eventId
FROM event_tags_map m
WHERE EXISTS (
SELECT 1 FROM event_tags_map m1 WHERE m1.eventId = 114778 AND m1.tagId = m.tagId
)
ORDER BY RAND() LIMIT 5;
Альтернативный вариант - использовать self- INNER JOIN
:
SELECT DISTINCT eventId
FROM event_tags_map m
INNER JOIN event_tags_map m1 ON m1.eventId = 114778 AND m1.tagId = m.tagId
ORDER BY RAND() LIMIT 5;
Оба решения должны иметь возможность использовать составной индекс для event_tags_map(eventId, tagId)
.