найти человека, который работал хотя бы в этих технологиях [actjs, mysql, express] из таблицы - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть таблица, которая содержит поле имени и технологий.

-----------------------------
|name       | technologies  |
-----------------------------
|shashin    | reactjs       |
-----------------------------
|shashin    | mysql         |
-----------------------------
|krupali    | express       |
-----------------------------
|paras      | mysql         |
-----------------------------
|shashin    | express       |
-----------------------------
|paras      | php           |
-----------------------------
|krupali    | php           |
-----------------------------
|shashin    | php           |
-----------------------------

Я хочу найти имя человека, который работал хотя бы во всех этих технологиях [actjs, mysql, express].

ВЫХОД:

-------------
|name       |
-------------
|shashin    |
-------------

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Хорошо принят ответ, но я предпочитаю

  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
0 голосов
/ 09 февраля 2019

Вы можете попробовать следующее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...