SELECT
count(a.id) num,
a.id,
a. NAME,
GROUP_CONCAT(b.tag)
FROM
table_A a
JOIN table_AB ab ON a.id = ab.a_id
JOIN (
SELECT
bb.id,
bb.tag
FROM
table_B bb
WHERE
bb.id IN (2, 3)
) b ON ab.b_id = b.id
GROUP BY
a.id
HAVING
num = 2
select p.* from table_p p where p.id in (select distinct(p_id) from table_p_k pk left join table_k k on pk.k_id = k.id and k.id in (2,3));