无法解决此SQL查询结果

时间:2012-07-12 19:58:03

标签: mysql sql

我似乎无法解决原因:

SELECT `Title`.`Title`, `FirstName`, `LastName`, `Address1`, `Address2`, `Town`.`Town`, `County`.`County`, `PostalCode`, `Phone1`, `Solo` 
FROM `Person` 
JOIN `Title` ON `Person`.`Title` = `Title`.`id` 
JOIN `Town` ON `Person`.`Town` = `Town`.`id` 
JOIN `County` ON `Person`.`County` = `County`.`id` 
WHERE `Person`.`Solo`='1' 
ORDER BY `LastName` ASC;

返回0结果,(它不应该,至少有5个结果Solo ='1')

如果我修改它,取出所有的JOINS:

SELECT `Title`, `FirstName`, `LastName`, `Address1`, `Address2`, `Town`, `County`, `PostalCode`, `Phone1`, `Solo` 
FROM `Person` 
WHERE `Person`.`Solo`='1' 
ORDER BY `LastName` ASC;

我得到了结果?如果我修改它以取出WHERE Person.Solo='1'它也给我结果,但只有2;在哪里,它应该返回所有行?有人可以解释一下吗?

:)

注意:Solo是一个tinyint,它在所有记录中都等于0或1!

2 个答案:

答案 0 :(得分:6)

您的加入是严格的,这意味着如果Person没有Title Town {{1然后它不会被返回。即使删除整个Country子句,也不会得到任何结果。

请尝试WHERE

这是对不同类型的联接如何工作的良好解释:A Visual Explanation of SQL Joins

答案 1 :(得分:1)

有一些常见的约定,使您的代码对其他人更具可读性。首先,始终使用id作为(自动增量)-primary-key。然后在相关表中使用xxxxx_id。其次,您应该使用更精确的JOIN声明:LEFT JOIN或INNER JOIN。这更容易阅读。第三:通常没有必要使用``。除此之外,您还可以使用表别名来减少SQL代码的数量。

SELECT ti.title, firstname, lastname, address1, address2, to.town, county.county, postalcode, phone1, solo 
FROM person AS p
LEFT JOIN title AS ti ON p.title = ti.id 
LEFT JOIN town AS to ON p.town_id = to.id 
LEFT JOIN county AS c ON p.county = c.id 
WHERE p.solo=1
ORDER BY lastname ASC;

只是推荐......