2011-05-05 7 views
-2
 SELECT * FROM `users` u, `markers` m,`imagemarkers` im 
WHERE u.username LIKE '%test%' 
    OR u.email LIKE '%test%' 
    OR u.location LIKE '%test%' 
    OR m.author LIKE '%test%' 
    OR m.bike LIKE '%test%' 
    OR m.title LIKE '%test%' 

where join 쿼리를 쓰지 않기 때문에 질문에이 SQL이 나타 났지만 대답을 제공 할 수 없었습니다.암시 적 where 조인을 명시 적 조인으로 다시 작성하는 방법

이 암시 적 조인은 예상 된 (짧은) 결과를 제공합니까, 아니면 교차 결합을 제공합니까? 그 이유는 무엇입니까?
새 조건을 추가하지 않고 명시 적 조인을 사용하여 이것을 다시 작성하려면 어떻게해야합니까 (user.id = markers.user_id) 등과 일치하지는 않습니다.

답변

3

이것은 교차 결합입니다. (I 마커 테이블과 imagemarkers 테이블은 사용자 테이블에 대한 참조가 가정 있습니다.이 잘 경우하지 않을 수 있습니다!) 이런 식으로 뭔가를 시도

SELECT * FROM `users` u, `markers` m,`imagemarkers` im 
WHERE m.user_id = i.id AND im.user_id = u.id 
    AND (u.username LIKE '%test%' 
    OR u.email LIKE '%test%' 
    OR u.location LIKE '%test%' 
    OR m.author LIKE '%test%' 
    OR m.bike LIKE '%test%' 
    OR m.title LIKE '%test%') 

을 당신이 명시 적으로 '가 무슨 뜻인지 모르겠어요 조인 '하지만 내 추측은 다음과 같습니다.

SELECT * FROM `users` u 
inner join `markers` m on (m.user_id = i.id) 
inner join `imagemarkers` im on (im.user_id = u.id) 
WHERE u.username LIKE '%test%' 
    OR u.email LIKE '%test%' 
    OR u.location LIKE '%test%' 
    OR m.author LIKE '%test%' 
    OR m.bike LIKE '%test%' 
    OR m.title LIKE '%test%' 
+0

나는 쿼리의 동작을 변경하지 않고 다시 작성해야했습니다. – Johan

+0

@ 요한, 미안하지만, 원래 미안하지만 질문에 게시 된 것은 단순히 의미가 없거나 정확히 정확히 무엇입니까? 1) 필터 사용자 테이블, 사용자 이름 또는 이메일이 "테스트"와 같은 레코드를 유지합니다. 2) 마커 테이블에서 비슷한 필터링을 수행합니다. 3) 필터링 된 사용자 테이블, 필터링 된 마커 테이블 및 필터링되지 않은 이미지 마커 테이블을 가져 와서 이들의 [데카르트 제품] (http://en.wikipedia.org/wiki/Cartesian_product)을 만듭니다. 세. 이 동작을 변경하고 싶었습니다. – bpgergo

+0

정확히 내가 알고 싶었던 것입니다. 알고 싶었어요 1 : ​​명시 적 조인 구문을 사용하여 정확히 동일한 결과를 표현하는 방법 2 : 이것은 교차 조인인지 아닌지 여부입니다. 당신은 2 점을 대답했습니다. – Johan

관련 문제