2012-03-11 3 views
1

나는 3 개의 테이블 이미지, image_tags 및 태그가 있습니다. 이미지 테이블은 이미지 정보를 포함하고, 태그는 태그를 포함하며, 이미지 및 태그는 이미지와 태그 사이의 관계를 포함하며, 많은 관계가 있습니다. AND 조건 (IN이 아님)이있는 여러 태그를 기반으로 이미지를 필터링하고 싶습니다.복수 AND 동일한 조인 된 테이블 coulmnn

이 나는 ​​시도했다 :

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id 
WHERE tag_0.tag = "tagme" 
AND tag_1.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags ON image_tags.tag_id = tags.id 
WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 
AND images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 

그러나 아무것도 그들이 존재하지만 그것이 항상 0 결과를 반환 일했다. 조건이 where 절에 있기 때문에 그것은 LEFT 조인을 사용하더라도

답변

0

첫 번째 시도는 올바른 것이지만 시도가 잘못되었습니다. 태그를 필터링하려는 방식대로 태그를 필터링하려면 image_tags에 두 번 참여하고 tags의 두 인스턴스를 모두 연결하여 image_tags 인스턴스를 분리해야합니다. 그리고 그것은 외부 조인이 아닌 내부 조인을 수행하려는 것처럼 보입니다. 여기 :

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it0 ON it0.image_id = i.id 
    INNER JOIN tags t0 ON t0.id = it0.tag_id 
    INNER JOIN image_tags it1 ON it1.image_id = i.id 
    INNER JOIN tags t1 ON t1.id = it1.tag_id 
WHERE i.filesize > 0 
    AND t0.tag = 'tagme' 
    AND t1.tag = 'excellent' 
ORDER BY i.posted DESC 
LIMIT 0, 40 

동일한 방법으로 다른 방법을 사용할 수 있습니다. 다음보십시오 :

SELECT i.* 
FROM images i 
    INNER JOIN image_tags it ON it.image_id = i.id 
    INNER JOIN tags t ON t.id = it.tag_id 
WHERE i.filesize > 0 
    AND t.tag IN ('tagme', 'excellent') 
GROUP BY i.id 
HAVING COUNT(DISTINCT i.tag) = 2 
ORDER BY i.posted DESC 
LIMIT 0, 40 

t.tag IN ('tagme', 'excellent') 조건 지정된리스트에 한계 허용 태그와 HAVING COUNT(DISTINCT i.tag) = 2 이미지가 그들 모두를 가지고 확인합니다.

+0

감사합니다 .. 당신은 록 스타입니다 ... – Hirak

1

귀하의 첫 번째 쿼리는 모두 "tagme" "우수"에 tags에서 안타를 필요로한다. 이처럼 ON 절에 조건을 이동 :

SELECT images.* FROM images 
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id AND tag_0.tag = 'tagme' 
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id AND tag_1.tag = 'excellent' 
WHERE images.filesize > 0 
GROUP BY images.id 
ORDER BY images.posted DESC LIMIT 0, 40 


두 번째 쿼리가 해제 방법 - 그것은 불가능한 조건이 있습니다

WHERE tags.tag = "tagme" 
AND tags.tag = "excellent" 

tags.tag수 없습니다 모두 "tagme" "우수"

+0

빠른 답장을 보내 주셔서 감사합니다. 그러나 필터없이 모든 결과를 반환합니다. 어떤 생각? – Hirak