문제

항목 테이블, 태그 테이블 및 그 사이의 조인 테이블이 주어지면 양식의 쿼리를 구현하는 좋은 방법은 무엇입니까?

p1 AND p2 AND ... AND pn AND NOT n1 AND NOT n2 ... AND NOT nk

SQL을 사용하고 있습니다. 모든 태그 P1 ... PN과 N1 ... NK와 일치하는 모든 항목을 찾으려면?

이것에 대한 좋은 "표준"솔루션이 있습니까?

도움이 되었습니까?

해결책

스키마를 모르면 말하기 어렵지만 이와 같은 것이 효과가 있습니다.

select article_id from articles
inner join tag t1 on t1.article_id=articles.article_id and t1.tag='included_tag'
inner join tag t2 on t2.article_id=articles.article_id and t2.tag='another_included_tag'
left outer join tag t3 on t3.article_id=articles.article_id and t3.tag='dont_include_tag'
left outer join tag t4 on t4.article_id=articles.article_id and t4.tag='also_dont_include_tag'
where t3.tag_id is null and t4.tag_id is null

포함 할 태그에 대한 내부 조인 및 포함되지 않겠던 태그에 반 결합 (외부 조인 +가 null)을 수행하십시오.

다른 팁

나는 이것이 당신이 찾고있는 것이라고 생각합니다.

SELECT * FROM TABLE_NAME WHERE COLUMN1 IN ('value1','value2','value3') AND COLUMN1 NOT IN ('value4','value5','value6')

그렇지 않다면 알려주세요. 나는 당신의 질문을 오해했을 것입니다.

데이터베이스에 태그를 저장하는 방법에 따라 다르지만 아마도 IN 운영자:

SELECT tag FROM myTags WHERE tag IN ('p1','p2',...)
SELECT tag FROM myTags WHERE tag NOT IN ('p1','p2',...)
SELECT DISTINCT itemID FROM ItemsTags it, Tags t 
WHERE it.tagID = t.ID AND t.tag IN ('p1','p2','p3') AND t.tag NOT IN ('p4','p5','p6')
SELECT i.title
  FROM items i
 WHERE EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag1')
   AND NOT EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag2')

SQL Server는이 구성에 대해 잘 작동하지만 Oracle은 올바르게 얻기 위해 약간의 힌트가 필요할 수 있습니다 (적어도 5 년 전).

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