SQL:如何从单个列中选择满足多个条件的单个id("row")

W. *_*ung 23 sql select

我有一个非常狭窄的表: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个国家/地区.

  • 正确,只要表不多次包含用户 - 祖先组合. (2认同)

Cha*_*ins 5

拥有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)


Huc*_*kIt 5

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)

  • 您需要将这三个语句进行 AND 运算,以确保用户来自所有 3 个国家/地区。如果将它们组合到 IN 子句中,则只能确保它们来自 3 个国家/地区之一。回复 9 年前的答案的 2 年前的评论很有趣。我应该再检查一下。 (3认同)

Kon*_*rak 2

第一种方式:加入:

获取来自多个国家/地区的人员:

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 次。仅获得一次不同的结果。

第二种方式:GROUP BY

这将获得拥有 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)

  • 我没有对你投反对票,但是你应该将“WHERE”移到“GROUP BY”上方。并使用“COUNT(DISTINCT ancestry)”。 (2认同)