mysql - 如何查询属于另一个表中 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;
我不确定这是一个正确的方法。谁能帮我解决这个问题?谢谢
解决方案
您编写的查询将返回在表中有多个条目的任何玩家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]
)。
推荐阅读
- twitter-bootstrap - 引导宽度溢出
- javascript - 如何在
- excel - 如何确保验证采用非空值?
- javascript - 除了“.value”之外,还有没有其他机会可以在 Javascript 中获取下拉菜单的内容?
- c++ - 如何消除这种与继承相关的代码异味?
- vba - XCOPY:源文件夹是否可能包含目标文件夹?
- laravel - docker-compose:如何在 docker 网络内外使用 minio
- c++ - 调试器看到的输出线程 ID
- amazon-web-services - aws cognito 不会获取所有用户
- javascript - React Native 异步 Jest 组件测试