2011-07-27 18 views
4

48時間連続してコーディングしていて、ここで壁に向かって頭を叩いています。この小さな問題で私を助けてください。SQL構文ヘルプ、条件付きAND

私のSQLクエリはこれです:

SELECT u.Firstname, u.Lastname, u.Rep, u.Email, u.Password, u.Gender, u.Level, 
     u.Birthday, u.Achievements, u.Height, u.Unit, u.cityid, u.countryid, 
     r.RegDate, ci.Name AS City, co.Name AS Country 
FROM Users u, Registry r, Cities ci, Countries co 
WHERE u.id = 1 AND r.uid = u.id AND u.cityid = ci.id AND u.countryid = co.id 
LIMIT 1 

私の問題は、私はちょうど時々Users.cityidUsers.countryid(OKです)NULLをしていることに気づいたということです。

私は一方または両方それらのフィールドがNULLであっても、クエリは私にこのユーザーの他のすべての情報を(のような、CityCountryためNULLを返す)与えたいです。 AND -partsを条件付きにする方法

私は自分の霧の中で自分自身を明確にしたいと思う。

+6

「48時間連続してコーディングしています」 - 問題があります! ;) –

+1

MySqlの正確な構文はわかりませんが、結果がnullの可能性のあるテーブルで外部ジョインをする必要があるようです。 – Tim

+3

["疲れたときは、どうやって生産性を保つのか?"](http://stackoverflow.com/q/1364056/27535)、愚かではない – gbn

答えて

3

代わりWHEREを使用してのあなたのテーブルの上にLEFT JOINを使用する必要があります。

だからあなたのターンFROMへ:

FROM Users u JOIN Registry r on u.id = r.uid 
LEFT JOIN Cities ci ON u.cityid = ci.id 
LEFT JOIN Countries co ON u.countryid = co.id 
WHERE u.id = 1 LIMIT 1 

LEFT JOINOUTERが参加しています。 JOIN(すなわち、最初に現れるもの)の最も左のエントリ(したがって、のJOIN)がエントリを持ち、もう一方のテーブルはエントリを持たないテーブル間で結合します。 OUTER JOINは、クエリから必要なものについてすべてのテーブルに必ずしもデータエントリがない場合に便利です。最初は混乱する可能性がありますが、SQLをうまく使用するには非常に重要になります。

+0

Doh、明らかに。ありがとう! – Mattis

4

あなたの状況を正しく理解していれば、私はOUTERのカップルが必要です。

SELECT ... 
FROM Users u 
INNER JOIN Registry r ON r.uid = u.id 
LEFT JOIN Cities ci ON u.cityid = ci.id 
LEFT JOIN Countries co ON u.countryid = co.id 
WHERE u.id = 1 
+1

ありがとうマーティン、私は正解タグを持っている人のコインを裏返しました:) – Mattis