Хорошо принят ответ, но я предпочитаю
SELECT name
FROM table_name
WHERE technologies IN ('reactjs', 'mysql', 'express')
GROUP BY name
HAVING COUNT(DISTINCT technologies) = 3
. DISTINCT
гарантирует, что у вас будет ровно 3 записей для каждого имени, если и только если они соответствуют всем тремтехнологии.Любые другие технологии будут удалены с помощью WHERE
Фактически, если вы поместите уникальный составной индекс на (name, technology)
в исходной таблице и разрешите каждой технологии появляться только один раз для данного имени, вымогу опустить DISTINCT technologies
из запроса выше
SELECT name
FROM table_name
WHERE technologies IN ('reactjs', 'mysql', 'express')
GROUP BY name
HAVING COUNT(*) = 3
В качестве дополнительного примечания , я бы очень хотел разделить своих людей и технологии на отдельные таблицы,и соедините их вместе с третьим столом
- человек -
id
, name
,… - технология -
id
, name
,… - person_technology -
id
, person_id
, technology_id
С person_id
и technology_id
, являющимися внешними ключами для соответствующих таблиц, и уникальными индексами
- технология -
name
- person_technology -
(person_id, technology_id)
Тогда ваш запрос станет
SELECT p.id,
p.name AS person,
t.name AS technology
FROM person p
JOIN person_technology pt
ON pt.person_id = p.id
JOIN technology t
ON t.id = pt.technology_id
AND t.name IN ('reactjs', 'mysql', 'express')
GROUP BY p.id, p.name
HAVING COUNT(*) = 3