Почему бы вам просто не сделать это:
SELECT *
FROM a
WHERE a.id IN
(
SELECT ab.a
FROM b
JOIN ab
ON ab.b = b.id
WHERE b.id IN (1, 2, 3, 4)
)
и создайте PRIMARY KEY
на ab (b, a)
?
Обновление:
Используйте это:
SELECT *
FROM a
WHERE (
SELECT COUNT(*)
FROM ab
WHERE ab.a = a.id
AND ab.b IN (1, 2, 3, 4)
) = 4
ORDER BY
...
LIMIT 30
или это:
SELECT a.*
FROM (
SELECT a
FROM ab
WHERE ab.b IN (1, 2, 3, 4)
GROUP BY
a
HAVING COUNT(*) = 4
) q
JOIN a
ON a.id = q.id
ORDER BY
...
LIMIT 30
Вам нужно будет PRIMARY KEY
на ab (b, a)
(в этом порядке), чтобы это работало быстро.
Какой запрос более эффективен, зависит от вашего распределения данных.