两个mysql表之间的简单联接每次返回所有结果。。帮助

两个mysql表之间的简单联接每次返回所有结果。。帮助,mysql,join,Mysql,Join,我刚刚将大量数据导入到两个表中。让我们称之为发货和退货 当尝试根据这两个表中的任何条件执行简单的左联接或内联接时。查询似乎试图进行交叉连接或查找每个组合,而不是查询应该提取的内容 每个表都有一个PK id字段,但除了一些共享字段之外,这两个表之间没有FK关系 我目前正在尝试将它们与装运id关联起来 我觉得这是一个简单的答案。我是否遗漏了一个参考资料或明显的原因?谢谢 这里有一个例子。这应该在100行以下返回。相反,这将返回数十万 SELECT r.* FROM returns as r le

我刚刚将大量数据导入到两个表中。让我们称之为发货和退货

当尝试根据这两个表中的任何条件执行简单的左联接或内联接时。查询似乎试图进行交叉连接或查找每个组合,而不是查询应该提取的内容

每个表都有一个PK id字段,但除了一些共享字段之外,这两个表之间没有FK关系

我目前正在尝试将它们与装运id关联起来

我觉得这是一个简单的答案。我是否遗漏了一个参考资料或明显的原因?谢谢


这里有一个例子。这应该在100行以下返回。相反,这将返回数十万

SELECT r.*

FROM returns as r

left outer join shipments as s

on r.shipment_id = s.shipment_id

where r.date = '2011-06-20'
乔希

我很想知道,如果强制连接到特定记录或记录集而不是整个表,会发生什么情况。假设您的表中有id为5的装运,您可以尝试:

    SELECT r.* FROM returns as r
        left join shipments as s 
        ON 5 = r.shipment_id
        WHERE r.date = '2011-06-20'
虽然只是一个想象中的where子句,但它至少可以证明您尝试的连接最终会正确工作。问题是,无论值是什么,on子句总是返回true。这可能是因为它没有将shipping_id解释为整数,而是将其解释为true/false变量,其中任何值的计算结果都为true

原始拒绝的解决方案:

为了实现连接,不需要外键关系。我假设的PK id字段是整数或数字,或者与rdms等效的任何字段

您能通过sql查询的一个片段吗

根据已发布的查询进行更新:

我会添加您的显式连接条件,以排除任何有趣的业务。我的猜测是,因为没有指定任何条件,它使用1=1,它总是连接。因此,我将您的查询更改为:

SELECT r.*
FROM returns as r
left join shipments as s ON
s.ShipId = R.ReturnId
where r.date = '2011-06-20'

以下是一个应该有效的查询:

SELECT T0.*, T1.*
FROM shipments AS T0 LEFT JOIN returns AS T1 ON T0.shipment_id = T1.shipment_id
ORDER BY T0.shipment_id;
此查询联接假定装运id为1:1


如果您包含了正在使用的查询,那就太好了。您需要指定要加入的内容,否则它将执行笛卡尔式加入:

SELECT r.*
FROM returns as r
LEFT JOIN shipments as s ON s.shipment_id = r.shipment_id
where r.date = '2011-06-20'

事实证明,这个问题非常简单,只是在通读所有专栏之前并不明显。事实证明,当装运ID达到int数据类型的上限时,它在每一行中都是重复的。这就是join返回所有记录的原因


在将数据类型切换到bigint并重新导入之后,一切都很顺利。感谢大家的关注。

您能发布两个表结构和查询吗?以及两个表中的几行数据。您没有将退货绑定到发货的ONclause。这意味着,对于退货中的每一行,您都将退货发货中的所有行。也就是说,返回*行数。@JoshG:请在问题中添加两个表的结构。这应该是注释,而不是答案。下面是一个示例。这应该在100行以下返回。我不知道是什么原因造成的。从退货中选择r.*作为r left outer join装运作为s,其中r.date='2011-06-20'Josh,您的DBMS系统是什么?另外,添加一个显式的on语句,如在S.shipId=R.returnIdit的mysql上的左外连接。on条件现在已经存在,我刚刚忘记粘贴它。一个简单的测试就是加入一个特定的值,看看是否得到预期的结果,例如S.shipping_id=5。不幸的是,这不起作用。这将返回大约2800行,而不是数十万行。这应该是可行的。否则你就做错了。我猜装运id在退货上,并且与装运id相关。因此,T0.id=T1.shipping\u-id在本例中,两个表中的shipping\u-id相互关联。感谢您的回复。不管我做什么,所有结果都会返回。您链接的查询返回的结果应该少于100个。相反,它返回数十万。我试过你的,结果都一样。@josh-你说所有结果都返回是什么意思?所有结果的日期都是“2011-06-20”吗?如果是这样,那么这仍然是正确的。但是,如果您只希望退货表中的行在发货表中实际具有相应的行,则需要将左联接更改为内部联接。也许这就是问题所在?我想我刚刚解决了这个问题。看起来出于某种原因,mysql的导入复制了每一行的发货id,而所有其他列保持唯一。我不确定这是怎么发生的,因为获取初始数据的源查询没有做到这一点。谢谢你调查这件事!