我有一个相当简单的查询,我试着写。
如果我运行以下查询:
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,所以也许我只是做错了。那说我猜它只是一个简单的错误。如果您需要样本数据,请告诉我,我会发布一些。感谢。
答案 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)
看到我正在进行开发设置,我的数据库有点混乱,因为我之前测试的东西和行丢失了。