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つしかありません。すべての行を返す必要があるのはどこですか? 誰か説明できますか?

:)

注: Solo は tinyint です。すべてのレコードで 0 または 1 に等しくなります!

4

2 に答える 2

6

あなたの結合は厳密です。つまり、orまたはthen がない場合は返されませんPerson。句全体を削除しても、結果は得られません。Title Town CountryWHERE

LEFT JOIN代わりに試してください。

これは、さまざまなタイプの結合がどのように機能するかについての適切な説明です: SQL 結合の視覚的な説明

于 2012-07-12T20:00:16.643 に答える
1

他の人がコードを読みやすくするための一般的な規則がいくつかあります。まず、常にid(autoincrement) -primary-key に使用します。次に、関連するテーブルで xxxxx_id を使用します。次に、より正確な JOIN 宣言を使用する必要があります: LEFT JOIN または INNER JOIN。そのほうが読みやすい。3 番目: 通常は `` を使用する必要はありません。それに加えて、テーブルエイリアスを使用して、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 に答える