首页 > 解决方案 > 如何查询属于另一个表中 2 个不同值的实体?

问题描述

我有一个如下所示的数据库模式。

查找属于两个不同团队并且在一个团队中担任教练角色和在另一团队中担任球员角色的人的 SQL 查询是什么?

Person
-------------
Id int
Name varchar(255)

Member
-------------
Id int
PersonId int
TeamId int
Role varchar(255)

Team
-------------
Id int
TeamName varchar(255)

到目前为止我能想到的是

SELECT * FROM Person p
JOIN Member m
ON p.Id = m.PersonId
GROUP BY p.Id
HAVING COUNT(m.Id) > 1;

我不确定这是一个正确的方法。谁能帮我解决这个问题?谢谢

标签: mysqlsql

解决方案


您编写的查询将返回在表中有多个条目的任何玩家Member。例如,如果您有一个人'player'在 3 个不同的团队中担任角色,您的查询将返回该人。当然,假设这种情况可能发生。

如果你想选择至少一支球队的球员和至少一支球队的教练,你可以使用:

SELECT p.Id, p.Name
FROM Person p
WHERE EXISTS (SELECT 1 -- select anything for checking if the row exists
              FROM Member m
              WHERE m.PersonId = p.Id
                AND m.Role LIKE 'coach')
  AND EXISTS (SELECT 1
              FROM Member m
              WHERE m.PersonId = p.Id
                AND m.Role LIKE 'player')

请注意,此查询假定没有Member人是同一支球队的球员和教练的条目。如果有这样的条目,查询也会返回这些人。


为了更轻松地管理角色,我还建议将角色移动到单独的表中,并使用它们的 ID 进行比较 ( m.Role = [id of the role in 'Role' table])。


推荐阅读