Снайпер: зомби-поисковик для отдельных тегов


Иногда это не достаточно, чтобы знать, какой легкой добычей является. Вы также должны знать, является ли вы сможете охотиться на него. Что хорошего почти не оказалось зомби, если вы не можете прочитать функциональных заклинания язык? Как вы как гуру обрабатывать бегемот?

Поэтому я представляю вам тег зомби, основанная на сниффер:

SELECT 
  q.Id AS [Post Link],
  q.Tags
FROM 
  Posts q
    INNER JOIN Posts a   ON q.Id           = a.ParentId
    INNER JOIN PostTags  ON q.Id           = PostTags.PostId
    INNER JOIN Tags      ON PostTags.TagId = Tags.id
WHERE 
      q.AnswerCount > 0
  AND q.AcceptedAnswerId IS NULL
  AND Tags.TagName   = '##TagName##'
GROUP BY 
  q.Id, q.Tags
HAVING 
      MAX(a.Score) >= ##MinScore:int?0##
  AND MAX(a.Score) <= ##MaxScore:int?0##

-- TagName: Tag name "as you would use in your post"
-- MinScore: Highest answer has at least votes:
-- MaxScore: Highest answer has at most votes:

Вы можете найти его на седе.

Как и его предшественник, он ищет легкую добычу по умолчанию:

  • вопросы, которые имеют по крайней мере один ответ
  • нет ответа есть результат более чем 0
  • самых высоких оценок ответов оценка менее 0
  • не принято отвечать

Однако, это также имеет имя тега, так что вы можете искать для C++ зомби или похожие. Это первый раз, когда я написал SQL-запрос с тремя JOINЫ, Так я не знаю, является ли это является хорошим тоном. Кроме того, я Группе q.Tags чтобы показать их в результате, но я думаю, что это хак и не очень хороший стиль.



Комментарии
1 ответ

При использовании "простой" псевдонимы для имен таблиц в запросе вы должны псевдоним все таблицы, а не только некоторые из них. Это делает запрос представляется более последовательным. На ваш запрос, вы a и q псевдонимы для двух граней Posts стол (Вопросы и ответы, это имеет смысл), но вы должны также псевдоним PostTags и теги таблицы, чтобы держать вещи последовательны.

Стилистически, тем не менее, ваш запрос иначе чистюля, и очень хорошо читает.

Когда запросы к таблицам, вы всегда должны предлагать оптимизатору как можно больше информации. Ты изменяешь в ваши запросы, игнорируя PostTypeID колонка (1 для вопросов, 2 ответов). Не полагаться на прогнозные значения как null или не null ParentID значения, чтобы исправить запрос.

Далее, обратите внимание, что вы можете поместить постоянная условия в JOIN синтаксис для таблицы. Вам не нужно, чтобы заставить этих констант в обычный, где-блока. Я предпочитаю собрать соответствующие условия, даже если они не являются частью соединения между таблицами. Это кодер-предпочтений... вы можете не согласиться.

Самая главная проблема у меня с запрос на использование имеющих-П., который в моем понимании всегда была инструментом-последней инстанции в SQL-запросе.

Обобщенные табличные выражения (ОТВ) сделали такой сложности гораздо проще за счет возможности агрегации в виртуальную таблицу до фактического запрос выполняется. КТР-это легче показать, чем описать, поэтому рассмотрим этот запрос с КТР вместо:

WITH BestAnswer as (
select ParentId, Max(Score) as Score
from Posts
where PostTypeId = 2
group by ParentId
)

SELECT
q.Id AS [Post Link],
q.Tags
FROM
Posts q
INNER JOIN PostTags pt
ON q.Id = pt.PostId
INNER JOIN Tags t
ON pt.TagId = t.id
AND t.TagName = '##TagName##'
INNER JOIN BestAnswer a
ON q.Id = a.ParentId
AND a.Score >= ##MinScore:int?0##
AND a.Score <= ##MaxScore:int?0##
WHERE
q.PostTypeId = 1
AND q.AnswerCount > 0
AND q.AcceptedAnswerId IS NULL

-- TagName: Tag name as you would use in your post
-- MinScore: Highest answer has at least votes:
-- MaxScore: Highest answer has at most votes:

Увидеть его в седе здесь.

5
ответ дан 19 марта 2018 в 08:03 Источник Поделиться