2010-01-04 3 views
6

이미지를 태그와 일치시키는 웹 응용 프로그램이 있으며 태그 검색을 위해 결과를 동적으로 조정할 방법을 만들어야합니다. 그러나, 나는 그 SQL 쿼리를 만드는 깔끔한 방법을 찾을 수 없다. 그리고 그것이 내가 당신의 도움을 필요로하는 곳이다.여러 값과 일치하는 SQL n - to - n

아이디어는 내가 태그를 검색하면 "깨끗한"와 "개"나는 태그 "깨끗한"와 "개"모두가 이미지 결과를 얻을 것입니다. 또한 "little"태그를 포함하면 결과가 세 개의 태그가 연결된 이미지로 좁혀 야합니다.

따라서는 N-에-N과 관련,이 작업을 수행하는 올바른 방법이 필요?

내 자연적인 접근 방식은 같은 코드 뭔가를 생성했지만, 그것은 어디로 나는 확실히 좋아하지 않는다 :

SELECT images.* 
FROM images 
INNER JOIN image_tags ON ... 
INNER JOIN tags ON ... 
WHERE tags.tag = @tag1 
AND EXISTS 
(
    SELECT 1 
    FROM images 
    INNER JOIN image_tags ON ... 
    INNER JOIN tags ON ... 
    WHERE tag = @tag2 
    AND EXISTS 
    (
    SELECT 1 
    FROM images 
    INNER JOIN image_tags ON ... 
    INNER JOIN tags ON ... 
    WHERE tag = @tag3 
    AND EXISTS (...) 
    ... 
) 
) 

은 물론, 그 정말 좋지 않다. 어떤 생각?

감사합니다.

답변

7

뭐 그런 당신이 당신의 예에서 추천 태그가있는 경우 다음 number_of_tags이 3 할 것이다. (나는 당신이 필요로하는 열을 사용, SELECTGROUP BY에 대한 id를 사용

SELECT images.id 
FROM images 
INNER JOIN image_tags ON ... 
INNER JOIN tags ON ... 
WHERE tags.tag IN (@tag1, @tag2, @tag3) 
GROUP BY images.id 
HAVING COUNT(*) = @number_of_tags 

일을하고, 수 일치 id 당 3 행 초래 가입 할 수 있습니다.

을 당신은 동적으로 쿼리를 작성하거나 말, 그것을 정의, 10 개 태그 및 태그 발생하지 값로 초기화 할 수 있습니다.

+0

이것은 각 이미지가 아닌 지정된 태그의 행을 반환 할뿐만 아니라 허용되는/허용되는 태그의 수가 매우 엄격합니다. –

+0

'GROUP BY '는 각 태그에 대한 행을 반환하지 않아야합니다. 동적 인 태그 수를 사용하는 방법을 보여주기 위해 질문을 편집했습니다. –

+0

고마워요! HAVING COUNT()를 사용하여 결과를 다시 확인하지는 않았습니다. – Alpha

0

N-N 관계를 사용하지 않고 텍스트 필드를 사용하여 태그를 저장합니다. 우리는 정상을 잃어버린되지만 태그는 일반적으로 단지 어쨌든 텍스트 검색에 사용되는 디스크 공간이 저렴대로

이 더러운 소리를 할 수 있습니다.

그런 다음 당신이 할 수있는 교 차 사용

SELECT * FROM images WHERE tags LIKE '%clean%' AND tags LIKE '%dog%'... 
+0

@Peter - 좋은 알파벳 순 ... D 다음에오다 ... ;-) –

+0

참고 : 솔루션을 사용하면 태그 당 이미지 수를 계산하고 태그의 이름을 바꾸거나 삭제하는 작업이 더욱 복잡해집니다. –

+0

@ md5sum : OMG! 죄송합니다. 해당 게시물을 삭제해야했습니다 .-) –

0

를 실행할 수 있습니다 :이 image_tags 태그 (모두 일치) 교차점을 기준으로 모든 이미지를 선택합니다

SELECT images.* 
FROM images 
WHERE image_id IN 
    (
    SELECT image_id FROM image_tags WHERE tag_id = 
     (SELECT tag_id FROM tags WHERE tag = @tag1) 
    INTERSECT 
    SELECT image_id FROM image_tags WHERE tag_id = 
     (SELECT tag_id FROM tags WHERE tag = @tag2) 
    INTERSECT 
     .... 
    ) 

.

관련 문제