我有一个包含名称和技术字段的表。
-----------------------------
|name | technologies |
-----------------------------
|shashin | reactjs |
-----------------------------
|shashin | mysql |
-----------------------------
|krupali | express |
-----------------------------
|paras | mysql |
-----------------------------
|shashin | express |
-----------------------------
|paras | php |
-----------------------------
|krupali | php |
-----------------------------
|shashin | php |
-----------------------------
我想找到一个至少在所有这些技术[reactjs,mysql,express]中都起作用的人的名字。
输出:
-------------
|name |
-------------
|shashin |
-------------
答案 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
作为旁注,我很想将我的人员和技术分离到单独的表中,然后将它们与第三个表结合在一起
id
,name
,…id
,name
,... id
,person_id
,technology_id
其中person_id
和technology_id
是各自表的外键,并且在
name
(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