문제

태그가 아닌 태그가없는 모든 항목을 검색하는 SQL 쿼리가 필요합니다. 이미 쿼리가 있지만 예상 결과가 아닌 두 태그를 모두 hove하는 모든 항목을 반환합니다. 아래에 자세한 설명을 찾으십시오. 감사!

테이블 구조 :

ITEMS TABLE
------------
item_id
item_name

TAGS TABLE
----------
tag_id
tag_name

ITEMTAGS TABLE
---------------
tag_id
item_id

질문:

SELECT Items.* FROM Items 
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id

결과 : T1 또는 T2가있는 모든 항목

예상 결과 : T1과 T2가 모두있는 모든 항목

도움이 되었습니까?

해결책

select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;

다른 팁

데이터베이스가 교차 키워드를 지원하는 경우 (SQLSERVER는) 다음을 작성할 수 있습니다.

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
/* intersection between items that have the tag T1 
   and the ones that have the tag T2 */ 
(
    SELECT item_id FROM ItemTags WHERE tag_id = T1
    INTERSECT 
    SELECT item_id FROM ItemTags WHERE tag_id = T2
)

그렇지 않은 경우 다음과 같은 작업을 수행해야합니다.

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
(
    SELECT ItemTags1.item_id 
    FROM ItemTags as ItemTags1 
        INNER JOIN ItemTags as ItemTags2 
        ON ItemTags1.item_id = ItemTags2.item_id 
    WHERE 
            ItemTags1.tag_id = T1
        AND ItemTags2.tag_id = T2
)

두 번째 쿼리에서 itemtags1.item_id = itemtags2.item_id로 인해 가능한 성능 문제를 해결하십시오. 잘 작동하려면 외국 키에 대한 색인이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top