2011-07-27 4 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입니다 것으로 나타났습니다 것입니다.

나는 쿼리 (같은 CityCountry에 대한 NULL을 반환) 나에게 다른 모든 정보를 줄 경우에도 하나 또는 둘 모두 해당 필드가 NULL있는이 사용자에 대한 싶습니다. AND -parts를 조건부로 만드는 방법은 무엇입니까?

나는 내 안개 속에서 자신을 분명히하고 싶습니다.

+6

"48 시간 연속 코딩 중"- 문제가 있습니다! ;) –

+1

MySql에 대한 정확한 구문은 확실하지 않지만 null 결과가있는 테이블에서 외부 조인을 수행해야하는 것처럼 들립니다. – Tim

+3

[ "피곤할 때 계속 생산성을 유지하는 방법"] (http://stackoverflow.com/q/1364056/27535)와 바보가되지 마라. – gbn

답변

3

당신은 대신 WHERE를 사용하여 테이블에 LEFT JOIN를 사용해야합니다.

그래서으로 회전에서 :

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에있는 가장 왼쪽의 테이블 (즉, LEFTJOIN)이 항목을 가지고 있지만 다른 테이블은 나타나지 않는 테이블을 조인 할 것입니다. OUTER JOIN은 쿼리에서 원하는 항목에 대해 모든 테이블에 데이터 항목이 반드시 있어야하는 경우에 유용합니다. 처음에는 혼란 스러울 수 있지만 SQL을 잘 사용하는 것은 매우 중요합니다.

+0

분명히. 감사! – 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