Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接mysql中的3个表,其中数据不存在于两个连接中_Mysql_Inner Join - Fatal编程技术网

连接mysql中的3个表,其中数据不存在于两个连接中

连接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

我在连接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 
    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
上创建一个唯一的索引。。。