2016-09-05 3 views
4

다음과 같은 sql 쿼리를 통해 내가 좋아하는 태그 이외의 다른 태그가없는 주목할만한 질문을 불러오고 더 많은 필터가 포함됩니다. 두 가지 주요 문제는이 쿼리가 있습니다특정 태그가있는 경우 recordonly 가져 오기

Live Demo

만에 => (당신은 할 수에서 을 달성하고

  1. 내가 신청 한 가짜 기술 (그래도 더 개선해야 할 수도 있습니다) 같은 쿼리를 두 번 먼저 사용하여 필자가 필요로하는 것을 얻은 다음 필자가 선호하는 태그보다 다른 태그를 가진 모든 질문을 무시하기 위해 필터가 아닌 다른 태그로 동일한 결과를 필터링해야했습니다. 내가 할 수있는 다른 방법을 찾지 못했습니다.
  2. distinct을 적용한 이유는 왼쪽 결합을 사용하지 않았더라도 중복 결과을 제공했기 때문입니다. ID이 같은 열에 여러 조건을 피할 수있는 유일한 당신이 필요로하는 열과 IN() 경우 당신은 HAVING 절을 사용할 수 있습니다 어떻게 IDS 수 I 별개의 독특한 키워드

Select distinct top 100 
'http://stackoverflow.com/questions/'+Cast(p.Id as varchar(20)) as ids 
from Posts p 
Join posttags pt on p.Id=pt.PostId 

where AcceptedAnswerId is null 
and AnswerCount = 0 
and len(body) <2000 
and viewCount<30 
and DateDiff(hour, p.creationDate, GETDATE())<200 
and ClosedDate is null 

and p.id not in 

(
select p.id as id from posts p join posttags pt 
on p.Id=pt.PostId 
where pt.tagId != 21 and pt.tagId != 3 
and pt.tagId != 9 and pt.tagId != 5 
and pt.tagId != 820 and pt.tagId != 2 
and pt.tagId != 22 and pt.tagId != 1508 
and pt.tagId != 46426 and pt.tagId != 96 
and pt.tagId != 363 

and AcceptedAnswerId is null 
and AnswerCount = 0 
and len(body) <3000 
and viewCount<30 
and DateDiff(hour, p.creationDate, GETDATE())<200 
and ClosedDate is null 
) 
order by ids 

--21 mysql --3 javascript --9 c# --5 php --820 jquery 
--2 html --22 sql --1508 json --46426 nodejs--96 asp.net 
--363 ajax 
+0

귀하의 질의에 불필요한 복잡성이 있습니다. 나는 당신이 처음에 그것을 단순화 할 것을 제안한다. (내 눈에 들어간 것은'pt.tagId'의 안쪽 셀렉션 목록이다.'pr.tagId not in (2,3,5,9,21, 22,96,363,820,1508,46426) '). 둘째로, 바깥 쪽 셀렉트가 내부에서 반환 된 것을 '안'을 요구한다는 것입니다. 그래서 실제로'p.id in (2,3,5,9,21,22,96,363,820,1508, 46426)'다른 조건들, 맞죠? – FDavidov

+1

첫 번째 진술은 정확합니다. 두 번째 진술은 정확하지 않습니다. 마이너스가 마이너스 인 것과 같지 않은 그는 ** 특정 태그 만 가진 ** ID 만 원합니다. 따라서 그는 다른 태그가 없는지 확인해야합니다. @FDavidov – sagi

+0

@sagi, 내부가 1,4,6,7,8을 반환하면 ... 외부가 모두를 원하지만 내부를 반환하면 외부가 2,3,5,9 ..., 맞습니까? (나는 여기서 다른 조건들을 무시하고있다). – FDavidov

답변

2

를 사용하지 않고 :

를 여기

확인 라이브 데모 Response waiting questions

Select distinct top 100 
     'http://stackoverflow.com/questions/'+Cast(p.Id as varchar(20)) as ids 
from Posts p 
Join posttags pt 
on p.Id=pt.PostId 
where AcceptedAnswerId is null 
    and AnswerCount <3 
    and len(body) <2000 
    and viewCount<30 
    and DateDiff(hour, p.creationDate, GETDATE())<200 
    and ClosedDate is null 
GROUP BY 'http://stackoverflow.com/questions/'+Cast(p.Id as varchar(20)) 
HAVING COUNT(*) = SUM(CASE WHEN tagID IN(21,3,9,820,2,22,1508,46426,96,363) THEN 1 ELSE 0 END) 

COUNT(*)ID의 총 레코드 수를 반환하면 SUM(CASE..)은 원하지 않는 태그가없는 레코드 수를 반환합니다. 그것들이 동일하면 원하는 태그 만 존재 함을 의미합니다.

+0

죄송합니다. 결과가 요구 사항을 충족하지 않습니다. Plz는 마지막 결과를 두 번째로 확인합니다. https://data.stackexchange.com/stackoverflow/query/edit/534403. 그 안드로이드에 대한 intrested 아니에요 – Sami

+0

미안하지만, '안 (대신)'()'에 있어야합니다. @Sami를 사용해보십시오. MySQL이 작동하는 것처럼 보입니다 (MySQL 및 SQL 태그가 반환되었습니다) – sagi

+0

예. 좋은데. 나는 대개 속도를 줄이기 때문에 그룹에별로 행복하지 않지만, 더 많이 보게하고, 최선의 해결책이 될 것입니다. – Sami

관련 문제