1

我似乎无法弄清楚为什么:

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;surley 它应该在哪里返回所有行?有人可以解释吗?

:)

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

4

2 回答 2

6

您的联接是严格的,这意味着如果Person没有Title Town Country不会返回。即使删除整个WHERE子句,您也不会得到任何结果。

试试LEFT JOIN吧。

这很好地解释了不同类型的连接是如何工作的:A Visual Explanation of SQL Joins

于 2012-07-12T20:00:16.643 回答
1

有一些常见的约定可以使您的代码对其他人更具可读性。首先,始终使用id(autoincrement) -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;

只是一个建议...

于 2012-07-12T20:07:22.573 回答