2010-08-09 4 views
1

나는 약간 혼란스러워. 내 엔진으로 InnoDB와 함께 MySQL 5+를 사용하고 있습니다. 다음 문을 실행하고 'user_temp'테이블이 비어 있으면 '사용자'테이블에 상관없이 항상 빈 결과 집합을 얻습니다.MySQL (InnoDB) 2 테이블에서 선택하고 항상 빈 결과 집합

SELECT * FROM `users`, `user_temp` 

'user_temp'에 무엇인가 입력하면 모든 결과가 반환됩니다. 이게 이러는 거니?

감사합니다.

+0

사용자 테이블의 레코드와 user_temp 테이블의 레코드를 비교하는 기준이 없으면 그것은 데카르트 제품입니다. –

+1

데카르트 조인은 한 테이블의 모든 행을 다른 테이블의 모든 행에 결합한다는 것을 의미합니다 (원하는 테이블이 아닌). 한 테이블에 아무 것도없는 경우 0을 곱하는 것과 같습니다. – JohnB

+0

그리고 암시 적 조인보다는 명시 적 조인을 권장합니다. 당신은 전자의 유연성이 훨씬 뛰어납니다. – staticsan

답변

2

SELECT 
    u.*, ut.* 
FROM 
    `users` u 
    LEFT OUTER JOIN `user_temp` ut 
    ON ut.user_id = u.user_id 

Here 가입 유형의 다양한의 좋은 시각적 인 설명이다 :, users에서 예컨대을 LEFT OUTER JOIN 무조건 얻을 수있는 결과를 사용합니다.

+0

와우, 고마워. – Ryan

+0

+1 : 좋은 링크! – JohnB

2

그건 INNER JOIN입니다. 그러나 조인 필드를 지정하고 있습니다. 나는 OUTER JOIN을 원한다고 생각합니다. 어쩌면 FULL OUTER JOIN

귀하의 예는 다음과 같이 다시 쓸 수있다 : 테이블 중 하나가 비어있는 경우 확실히 경우 것 행이 id_user에 일치하지 않는 경우

SELECT * FROM users, user_temp 
INNER JOIN user_temp 
ON users.id_user = user_temp.id_temp 

, 다음, 당신이 얻을 것이다 0 결과 세트의 레코드.

시도 :

SELECT * FROM users, user_temp 
LEFT JOIN user_temp 
ON users.id_user = user_temp.id_temp 
+0

그게 맞습니까? 알았어 고마워. – Ryan

+0

위의 SQL은 명시 적으로'JOIN' 구문을 demostrates, 나는 그것을 사용 습관을 만듭니다. 'WHERE' 절이 필드에 매치되도록 (듯이) FROM 절에 복수의 테이블을 열거하면, 가장 빠른 정답에 암시 적으로 – JohnB

+0

+1의'INNER JOIN '이됩니다. – bernie