从表中找到一个至少在这些技术[reactjs,mysql,express]中工作过的人

时间:2019-02-09 06:41:30

标签: mysql sql

我有一个包含名称和技术字段的表。

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

我想找到一个至少在所有这些技术[reactjs,mysql,express]中都起作用的人的名字。

输出:

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

2 个答案:

答案 0 :(得分:5)

您可以尝试以下操作。

Task

如果您要使用特定技术,可以尝试以下操作。

select name from TableName
group by name
having count(distinct technologies) > 2

答案 1 :(得分:1)

可接受的答案很好,但我更喜欢

  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

作为旁注,我很想将我的人员和技术分离到单独的表中,然后将它们与第三个表结合在一起

  • person-idname,…
  • 技术-idname,...
  • person_technology-idperson_idtechnology_id

其中person_idtechnology_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