假设我们有一个包含列c1,c2,c3,...
的表格对于列c2,我对特定值k1,k2,...,kn。
感兴趣考虑行的子集,其中每行具有相同的c1值,如果我们在子集中获取c2的值列表,则该列表必须包含所有值k1,k2,...,kn。< / p>
我真正想要的是每个这样的子集的c1值列表。
[编辑:回应下面的第一条评论:]为了提供一个基本的例子,假设我有一个表,其中userid为第1列,技能列为第2列。此表中有大约15种技能。我希望获得拥有所有三种特定技能的所有用户的用户ID,例如[sql,php,js]
我如何在SQL中提取它?
答案 0 :(得分:1)
你描述了关系分裂。 https://en.wikipedia.org/wiki/Relational_algebra
让R(c1 PRIMARY KEY, c2, c3)
- 表
S(col)={ k1, k2, ..., kn}
- 包含设定值,分隔符。
两种通用方法不是EXISTS - 用余数除法和COUNT() - 精确除法。
SELECT DISTINCT c1
FROM R r1
WHERE NOT EXISTS
(SELECT *
FROM S
WHERE NOT EXISTS
(SELECT *
FROM R AS r2
WHERE (r1.c1 = r2.c1)
AND (r2.c2 = S.col)));
和
SELECT r1.c1
FROM R AS r1,
JOIN S AS s1 ON r1.c2 = s1.col
GROUP BY r1.c1
HAVING COUNT(r1.c2) = (SELECT COUNT(s2.col) FROM S s2);
有关更多方法,请参阅https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/。