我似乎无法解决原因:
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!
答案 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;
只是推荐......