当我尝试从两个表连接数据时,行丢失

时间:2010-06-08 19:16:32

标签: sql mysql

我有一个相当简单的查询,我试着写。

如果我运行以下查询:

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

过去我在查询中从未真正处理过OR,所以也许我只是做错了。那说我猜它只是一个简单的错误。如果您需要样本数据,请告诉我,我会发布一些。感谢。

4 个答案:

答案 0 :(得分: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 :(得分: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子句消除OR,并使用长格式连接,这清楚地说明了在join子句中使用了什么,以及在where中使用了什么。

答案 2 :(得分:0)

检查parts.parts_id的值是否缺少6行。您可能在sp.parts_id中没有相应的值(或者parts.parts_id的值可能为null)。请注意,它必须与联接起作用完全匹配。

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

答案 3 :(得分:0)

看到我正在进行开发设置,我的数据库有点混乱,因为我之前测试的东西和行丢失了。