MySQL查询表过滤问题
我一直在努力做以下事情 我有三张桌子:球员、球员服装和球队服装 表MySQL查询表过滤问题,mysql,sql,Mysql,Sql,我一直在努力做以下事情 我有三张桌子:球员、球员服装和球队服装 表玩家: id user team_id 1 tom 4 2 robo 5 3 bob 4 鲍勃有35条和45条衣服,机器人没有 表团队服装: id clothes_id p_id 1 13 1 2 35 3 3 45 3 id clothes_id team_
玩家
:
id user team_id
1 tom 4
2 robo 5
3 bob 4
鲍勃有35条和45条衣服,机器人没有
表团队服装:
id clothes_id p_id
1 13 1
2 35 3
3 45 3
id clothes_id team_id
1 35 4
2 45 4
3 55 4
4 65 5
(我按玩家的衣服分组。衣服id,因为信不信由你,两个玩家可以被分配同一件衣服)
我认为这将产生以下结果(13、35、45)
现在,我想对照第4队拥有的一套衣服进行检查
SELECT clothes_id FROM teams_clothes WHERE team_id = 4 and this return (35, 45, 55)
如何创建查询以使其返回(13)?我尝试过一些类似于“不存在于”的事情,但我认为玩家组成的团队会阻碍我的发展
select * from A where team_id = $team_id join B on B.a_id = A.id
where not exists
(
select 1 from C where C.clothes_id = B.clothes_id and team_id = $team_id
)
基本上,我们会找到他们团队中的所有As成员,并为每个成员加入他们穿的所有衣服,然后只有在表C中找不到衣服在我们团队中的指示时才返回该行(这包括在C中不存在,但在C中的错误团队中存在)我建议
select * from A where team_id = $team_id join B on B.a_id = A.id
where not exists
(
select 1 from C where C.clothes_id = B.clothes_id and team_id = $team_id
)
基本上,我们会找到团队中的所有As成员,并为每个成员添加他们穿的所有衣服,然后只有在表C中找不到衣服在我们团队中的指示时才返回该行(这包括在C中不存在,但在C中的错误团队中存在)这应该可以做到:
SELECT b.a_id, b.clothes_id
FROM
b INNER JOIN a
ON b.a_id = a.id
LEFT OUTER JOIN c
ON a.team_id = c.team_id
WHERE
c.clothes_id = NULL
我们的想法是对表A/B的组合与表C进行外部连接,然后只查找C.Cloth_id为NULL的情况,这将表示外部连接上没有关系匹配的情况(即,该用户的团队未批准衣服项目)。这应该可以做到:
SELECT b.a_id, b.clothes_id
FROM
b INNER JOIN a
ON b.a_id = a.id
LEFT OUTER JOIN c
ON a.team_id = c.team_id
WHERE
c.clothes_id = NULL
我们的想法是对表A/B的组合与表C进行外部连接,然后只查找C.Cloth_id为NULL的情况,这将表示外部连接上没有关系匹配的情况(即,该用户的团队未批准衣服项目)。不确定这对您来说是否为时已晚,但我要改变数据库模型本身,使这种情况首先不可能发生:
(“为简洁起见,省略了“不重要”字段,包括代理键,如PLAYER_ID。)
注意TEAM_ID如何通过标识关系从一个团队迁移到另一个玩家,然后迁移到玩家文章,在那里它与通过TEAM_文章迁移的相同字段合并。因为在PLAYER_ARTICLE表中只有一个物理团队ID字段,所以永远不能插入引用不同团队的行
更抽象地说:这是一个菱形的依赖关系,团队位于顶部,玩家文章位于底部。底部的合并(通过使用标识关系实现)确保双方必须始终指向同一顶部
您的示例数据将如下所示
玩家:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
团队主题:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
玩家\u文章:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
我不确定这对您来说是否太晚了,但我首先要更改数据库模型本身,使这种情况不可能发生:
(“为简洁起见,省略了“不重要”字段,包括代理键,如PLAYER_ID。)
注意TEAM_ID如何通过标识关系从一个团队迁移到另一个玩家,然后迁移到玩家文章,在那里它与通过TEAM_文章迁移的相同字段合并。因为在PLAYER_ARTICLE表中只有一个物理团队ID字段,所以永远不能插入引用不同团队的行
更抽象地说:这是一个菱形的依赖关系,团队位于顶部,玩家文章位于底部。底部的合并(通过使用标识关系实现)确保双方必须始终指向同一顶部
您的示例数据将如下所示
玩家:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
团队主题:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
玩家\u文章:
TEAM_ID PLAYER_NO
4 1 -- Tom
5 1 -- Robo
4 2 -- Bob
TEAM_ID ARTICLE_ID
4 35
4 45
4 55
5 65
TEAM_ID PLAYER_NO ATRICLE_ID
4 1 13 -- Tom: this is impossible (FK violation).
4 2 35 -- Bob
4 2 45 -- Bob
为您的表和别名提供有意义的名称,甚至[更多]例如。谢谢,注意它为您的表和别名提供有意义的名称,甚至[更多]例如。谢谢,注意它