2010-06-08 87 views
0

我有一个相当简单的查询,我尝试编写。当我尝试从两个表中加入数据时,行会丢失

如果我运行下面的查询:

SELECT parts.id, parts.type_id 
FROM parts 
WHERE parts.type_id=1 
    OR parts.type_id=2 
    OR parts.type_id=4 
ORDER BY parts.type_id; 

我去退还所有我所期望的行。现在,当我试图抓住从另一个表parent_unit用下面的查询六行突然掉出结果:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts, serialized_parts sp 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
    AND sp.parts_id = parts.id 
ORDER BY parts.type_id 

在过去,我从来没有真正在我的查询处理的手术室所以我可能只是做错了。这就是说,我猜这只是一个简单的错误。让我知道你是否需要样本数据,我会发布一些。谢谢。

+2

请学会使用显式连接。 – HLGEM 2010-06-08 19:24:24

+0

支持HLGEM的评论,请参阅:http://stackoverflow.com/questions/2241991/in-mysql-queries-why-use-join-instead-of-where – 2010-06-08 19:26:24

回答

0

检查缺少6行的parts.parts_id的值。您可能在sp.parts_id中没有相应的值(或者parts.parts_id的值为空)。请注意,它必须完全匹配才能工作。

作为OR字符串的替代方法,您可以使用parts.type_id IN(1,2,4)。它与列出的ORs一样工作,但更易于阅读。

5

为确保它具有与没有连接相同的行数,请使用左外连接

http://dev.mysql.com/doc/refman/5.0/en/join.html

例如:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp 
ON sp.parts_id = parts.id 
WHERE (parts.type_id=1 OR parts.type_id=2 OR parts.type_id=4) 
ORDER BY parts.type_id 

加入的默认类型是内连接。在内部连接上,如果表A和表B中的连接字段之间没有匹配,则不会显示表A和表B的内容。最有可能的情况是零件表中有六行,没有serilized_parts行,其parts_id与零件行的id匹配。如果是这种情况,则执行左外部联接将显示没有serialized_parts行的行以匹配它们,通过将sp.parent_unit显示为NULL

+1

这也是我的猜测,另一个表没有一个记录匹配每个记录inteh第一个表。 – HLGEM 2010-06-08 19:25:17

0

试试这个:

SELECT parts.id, parts.type_id, sp.parent_unit 
FROM parts 
LEFT JOIN serialized_parts sp ON sp.parts_id = parts.id 
WHERE parts.type_id IN (1,2,4) 
ORDER BY parts.type_id 

消除或与IN子句,这是简单的阅读和理解,并使用长的形式加入其中清楚什么联接子句中使用的和什么是用在哪里。

0

看到我正在开发设置的工作,我的数据库有点混乱,从我以前测试的东西和行丢失。

相关问题