我有一个非常狭窄的表:user_id,ancestry.
user_id列是自解释的.
祖先列包含用户祖先欢呼的国家/地区.
用户可以在表上有多行,因为用户可以拥有来自多个国家/地区的祖先.
我的问题是:如何选择其祖先来自多个指定国家/地区的用户?
例如,向我展示所有拥有来自英格兰,法国和德国的祖先的用户,并返回符合该标准的每个用户1行.
什么是SQL?
user_id ancestry
--------- ----------
1 England
1 Ireland
2 France
3 Germany
3 Poland
4 England
4 France
4 Germany
5 France
5 Germany
Run Code Online (Sandbox Code Playgroud)
在上述数据的情况下,我预计结果为"4",因为user_id 4具有来自英格兰,法国和德国的祖先.
提前致谢.
PS澄清:是的,user_id/ancestry列创建一个唯一的对,因此不会为给定用户重复一个国家/地区.
PPS我在寻找来自3个国家的用户 - 英格兰,法国和德国(以及这些国家是任意的).
PPPS我不是在寻找特定于某个RDBMS的答案.我想"一般地"回答这个问题.
我满足于为每个查询重新生成where子句,前提是可以通过编程方式生成where子句(例如,我可以构建一个函数来构建WHERE/FROM - WHERE子句).
小智 22
试试这个:
Select user_id
from yourtable
where ancestry in ('England', 'France', 'Germany')
group by user_id
having count(user_id) = 3
Run Code Online (Sandbox Code Playgroud)
最后一行表示用户的祖先拥有所有3个国家/地区.
拥有3个国家之一的用户
SELECT DISTINCT user_id
FROM table
WHERE ancestry IN('England','France','Germany')
Run Code Online (Sandbox Code Playgroud)
所有3个国家/地区的用户
SELECT DISTINCT A.userID
FROM table A
INNER JOIN table B on A.user_id = B.user_id
INNER JOIN table C on A.user_id = C.user_id
WHERE A.ancestry = 'England'
AND B.ancestry = 'Germany'
AND C.ancestry = 'France'
Run Code Online (Sandbox Code Playgroud)
SELECT DISTINCT (user_id)
FROM [user]
WHERE user.user_id In (select user_id from user where ancestry = 'England')
And user.user_id In (select user_id from user where ancestry = 'France')
And user.user_id In (select user_id from user where ancestry = 'Germany');`
Run Code Online (Sandbox Code Playgroud)
获取来自多个国家/地区的人员:
SELECT u1.user_id
FROM users u1
JOIN users u2
on u1.user_id = u2.user_id
AND u1.ancestry <> u2.ancestry
Run Code Online (Sandbox Code Playgroud)
获取来自 2 个特定国家/地区的人员:
SELECT u1.user_id
FROM users u1
JOIN users u2
on u1.user_id = u2.user_id
WHERE u1.ancestry = 'Germany'
AND u2.ancestry = 'France'
Run Code Online (Sandbox Code Playgroud)
对于 3 个国家...加入 3 次。仅获得一次不同的结果。
这将获得拥有 3 行(具有...计数)的用户,然后您指定允许哪些行。请注意,如果您没有 UNIQUE KEY (user_id, ancestry),则出现 3 次的“id, england”用户也将匹配...所以这取决于您的表结构和/或数据。
SELECT user_id
FROM users u1
WHERE ancestry = 'Germany'
OR ancestry = 'France'
OR ancestry = 'England'
GROUP BY user_id
HAVING count(DISTINCT ancestry) = 3
Run Code Online (Sandbox Code Playgroud)