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

为您的表和别名提供有意义的名称,甚至[更多]例如。谢谢,注意它为您的表和别名提供有意义的名称,甚至[更多]例如。谢谢,注意它