连接mysql中的3个表,其中数据不存在于两个连接中
我在连接3个表时遇到了一个问题,其中我需要的数据是两个表中的一个,但不是两个都是 假设我们有表'customers'和列'id','city','state',以及两个数据表data_a和data_b和列'id',以及我想要的数据 现在我有一个类似于下面的声明连接mysql中的3个表,其中数据不存在于两个连接中,mysql,inner-join,Mysql,Inner Join,我在连接3个表时遇到了一个问题,其中我需要的数据是两个表中的一个,但不是两个都是 假设我们有表'customers'和列'id','city','state',以及两个数据表data_a和data_b和列'id',以及我想要的数据 现在我有一个类似于下面的声明 SELECT cust.id, cust.city, cust.state, a.info as infoa, b.info as infob FROM customers cust INNER JOIN data_a a
SELECT cust.id, cust.city, cust.state, a.info as infoa, b.info as infob
FROM customers cust
INNER JOIN data_a a
ON cust.id = a.id
INNER JOIN data_b b
ON cust.id = b.id
WHERE cust.city = 'mytown';
这需要很长时间才能运行,而且我还没有从查询中得到任何响应,因为我将在它完成之前杀死它(如果它真的完成的话)
如果我删除了第二个数据表,该语句工作正常,只有在添加它时才会出现问题。所有id列以及城市列都被索引
还是我最好创建一个临时表并执行两个连接,将它们插入临时表并从临时表中读取
编辑:修正了打字错误
如果我使用左连接,则查询将处于执行状态,可能是无限期的。使用内部联接时,我将得到一个空集。如果联接在一个表上,但不是在两个表上,则需要左联接:
SELECT cust.id, cust.city, cust.state, a.info as infoa, b.info as infob
FROM customers cust
LEFT JOIN data_a a
ON a.id = cust.id
LEFT JOIN data_b b
ON b.id = cust.id
WHERE cust.city = 'mytown';
确保您具有以下索引:
cust: ('city')
data_a: ('id')
data_b: ('id')
如果联接在一个表上,但不是在两个表上,则需要左联接:
SELECT cust.id, cust.city, cust.state, a.info as infoa, b.info as infob
FROM customers cust
LEFT JOIN data_a a
ON a.id = cust.id
LEFT JOIN data_b b
ON b.id = cust.id
WHERE cust.city = 'mytown';
确保您具有以下索引:
cust: ('city')
data_a: ('id')
data_b: ('id')
不确定这是否能解决任何问题,但如果使用
left join
s会发生什么。对于我来说,这似乎总是适用于类似的select。您使用cust.id=b.id上的加入了两次相同的数据,这让youTypo大吃一惊?您在两个连接中都在b.id
上连接。如果这是您真正的查询,那么这就是您的问题。id字段是否为PK?表是否已编制索引?@Nico所有3个表都在id和city上编制索引,没有主键,但不确定这是否会解决任何问题,但如果使用left join
s会发生什么。对于我来说,这似乎总是适用于类似的select。您使用cust.id=b.id上的加入了两次相同的数据,这让youTypo大吃一惊?您在两个连接中都在b.id
上连接。如果这是您真正的查询,那么这就是您的问题。id字段是否为PK?这些表都被索引了吗?@Nico所有3个表都在id和city上被索引,没有主键,不管这是如何工作的,只花了一分钟的时间来响应。我肯定我已经试过了,但我会继续,并尝试让它运行得更快。@NickR,为了让它更快,在data\u a.id
和data\u b.id
和cust.id
上创建主键,然后在cust.city,cust.id
上创建一个唯一的索引。这一切都成功了,只花了一分钟的时间做出响应。我肯定我已经试过了,但我会继续,并尝试让它运行得更快。@NickR,为了更快,在data\u a.id
和data\u b.id
和cust.id
上创建主键,并在cust.city,cust.id
上创建一个唯一的索引。。。