이것은 "설정에서-세트"쿼리의 예입니다. 가장 일반적인 방법은 group by
을 사용하고 로직을 having
절에 넣는 것입니다. 귀하의 경우 :
SELECT B.name, B.author, B.id, B.finished, B.manual
FROM books B INNER JOIN
xrefbookstags XRBT
ON XRBT.idBooks = B.id JOIN
tags T
ON XRBT.idTags = T.id
group by B.name, B.author, B.id, B.finished, B.manual
having sum(case when t.name = 'novel' then 1 else 0 end) > 0 and
sum(case when t.name = 'biography' then 1 else 0 end) > 0 and
sum(case when t.name not in ('novel', 'biography') then 1 else 0 end) = 0;
논리는 다음과 같습니다. 첫 번째 절은 하나 이상의 태그가 'novel'
일 때 true입니다. 두 번째 절은 적어도 하나의 절이 'biography'
이고 다른 태그가없는 경우 세 번째 절이 참일 때 true입니다.
이것은 쉽게 일반화 할 수 있습니다. 당신이 책을 원한다면
having sum(case when t.name = 'novel' then 1 else 0 end) > 0 or
sum(case when t.name = 'biography' then 1 else 0 end) > 0;
: 당신은 하나 또는 다른 있었다 책을 원한다면
having sum(case when t.name = 'novel' then 1 else 0 end) > 0 and
sum(case when t.name = 'biography' then 1 else 0 end) > 0;
:이 두 태그를했지만, 다른 사람을 가질 수 책을 원한다면, 단지 세 번째 절을 생략 그 한 두 플러스 '역사', 당신은 그것을 추가 할 것입니다 : 당신이를 원하지만 요리에 대한 경우,
having sum(case when t.name = 'novel' then 1 else 0 end) > 0 and
sum(case when t.name = 'biography' then 1 else 0 end) > 0 and
sum(case when t.name = 'historical' then 1 else 0 end) > 0;
그리고 :
는
having sum(case when t.name = 'novel' then 1 else 0 end) > 0 and
sum(case when t.name = 'biography' then 1 else 0 end) > 0 and
sum(case when t.name = 'historical' then 1 else 0 end) > 0 and
sum(case when t.name = 'cooking' then 1 else 0 end) = 0;
편집 :
당신이 일치 할 태그의 쉼표로 구분 된 목록이있는 경우
은, 당신은 할 수 있습니다 :
having sum(case when ','[email protected]+',' not like '%,'+t.name+',%' then 1 else 0 end) = 0 and
count(distinct t.name) = 1 + len(@list) - len(replace(@list, ',', ''))
첫 번째 절은 모든 태그는 목록에있는 것을 말한다. 두 번째는 태그의 길이가 목록의 길이라는 것입니다.
이것은 본질적으로 의사 코드입니다. 서로 다른 데이터베이스는 len()
함수의 서로 다른 이름과 함께 문자열을 연결하는 다양한 방법과 변수 값을 표현하는 다양한 방법을 제공합니다. 그러나 그 의도는 분명해야합니다.
실제로 입력 태그를 제어 할 수는 없지만 변수가 포함되어 있습니다. 여기'('소설', '전기')는 단지 예일뿐입니다. COUNT (T.id)를 출력하고 끝에 GROUP BY T.id를 추가 할 수 있습니다. 그러나이 방법은 SQL 출력을 후 처리합니다. SQL 만 사용하고 압축 된 요청을 사용하여 모든 결과를 얻고 싶습니다. – vanna