如何理解mysql内部连接?

如何理解mysql内部连接?,mysql,sql,Mysql,Sql,我的问题如下: users = select * from users where group_id = 1 and track_id = "xxxxxx"; user_ids = [user.id for user in users] tickets = select * from tickets where group_id = 1 and user_id in (user_ids); 用户和票证表都有组id字段 用户表的索引位于group\u id和track\u id字段中; 票证表的

我的问题如下:

users = select * from users where group_id = 1 and track_id = "xxxxxx";
user_ids = [user.id for user in users]
tickets = select * from tickets where group_id = 1 and user_id in (user_ids);
用户
票证
表都有
组id
字段

用户表的索引位于
group\u id
track\u id
字段中; 票证表的索引位于
组id
用户id
字段中

我想将两个sql合并为一个

select * from tickets join users on tickets.user_id = users.id
where tickets.group_id = 1 and users.track_id = "xxxxx";

是这样吗?哪个更好?我知道“内部联接”是什么意思,但我想知道我应该使用
票证。组id
用户。组id
?有什么区别

如何理解mysql内部连接?它是如何工作的?

您需要测试两个
组id
字段,就像您在合并的查询中所做的一样

SELECT *
FROM tickets AS t
JOIN users AS u ON t.user_id = u.user_id
WHERE t.group_id = 1
AND u.group_id = 1

您的第一个查询将为您提供组1的所有票证,用户可以在任何组中。第二个查询将为组1中的用户提供所有票证,即使票证位于组2。

考虑其他联接条件:如果两个表中的组ID始终相同,则应添加组ID作为联接条件,并按或进行筛选

SELECT * 
FROM tickets join users 
  on tickets.user_id = users.id
 and tickets.group_ID = users.group_ID
WHERE tickets.group_id = 1 and users.track_id = "xxxxx";
或者,您必须根据两者进行筛选:因为组ID可能不同于票证ID,所以您必须根据两者进行筛选

这最准确地表示了两个查询的结合。如果加入时票证和用户的组ID不同

SELECT * 
FROM tickets join users 
  on tickets.user_id = users.id
WHERE tickets.group_id = 1 
  and users.group_id = 1 
  and users.track_id = "xxxxx";
然而,从逻辑上讲,我们需要理解两个表中“GROUP_ID”的用途。每个功能的功能目的是什么?我可以想象卖掉一组组票。。。但是我不知道用户怎么会在一个静态组中,因为根据事件的不同,随着时间的推移,用户可能会在多个组中

也许您不应该在两个表中都包含组ID?也许您需要一个用户组表


如果两组代表实体的不同基本属性,则必须分别对其进行评估;因此,第二个查询最有意义。但是,如果它们表示相同的实体属性,那么添加到联接条件就更有意义了

您可能需要从它们的文档开始:@Siyual这与内部联接和外部联接有什么关系?@Barmar它没有-但是其中的答案清楚地回答了他关于内部联接如何工作的问题。@Siyual哪个答案会告诉他他是否需要使用
where tickets.group_id=1
where users.group_id=1
?这是他的问题。@Barmar我知道这是他现在的问题,但当时还不清楚-我可以删除它。这取决于他在寻找什么。如果他想要组1的所有票证,而不管用户在哪个组,那么
t.group_id=1
中唯一需要的东西,其中
@CptMisery查看他想要合并的原始查询。他使用
users.group\u id=1
获取用户id列表,然后在获取属于这些用户的票证时使用
tickets.group\u id=1
。为了获得同等的效果,他需要在连接中测试它们。@Barmar你说得对!如果两个组都是id,我发现mysql扫描的行数较少,两个表都使用index.nice答案!我认为对于票表,不需要组id。但是我从票证中删除了组id,mysql将扫描所有票证行;对于tickets组id,如果我想获得组用户的tickets,我可以这样做:
select*fromtickets,其中group\u id=1用户和票证只是一个例子。我仍然不理解两者的功能目的。也许数据库的设计有点不对劲?。也许今天某个用户属于某个组。购买票证后,他们属于不同的组并购买票证,因此每个用户的票证中的组ID值代表用户购买时的组ID?同样,没有足够的功能信息来了解如何/为什么使用组,因此有两个潜在的连接答案。在这两种情况下,GROUP_ID是否都是名为GROUP的表的FK,并且ID是主键?
SELECT * 
FROM tickets join users 
  on tickets.user_id = users.id
WHERE tickets.group_id = 1 
  and users.group_id = 1 
  and users.track_id = "xxxxx";