Выберите максимальный предел 1 из группы - PullRequest
7 голосов
/ 26 июля 2010

Я делаю систему кэширования веб-страниц. Я хотел создать простую систему ранжирования страниц вместе с выводом. Проблема в том, что я хочу отображать набор записей с наибольшей оценкой релевантности для уникального домена. Один домен может иметь несколько записей, но с разными заголовками, описаниями и т. Д. Проблема в том, что вместо получения 1 набора записей, содержащего уникальный домен, он группирует все наборы записей этого уникального домена и выводит их все. Я просто хочу, чтобы набор записей с наивысшим показателем релевантности для уникального домена в каждой группе перед выводом следующего (и другого домена с наибольшей релевантностью для этой группы)

SELECT title, html, sum(relevance) FROM
  (
  SELECT title, html, 10 AS relevance FROM page WHERE title like ‘%about%’ UNION
  SELECT title, html, 7 AS relevance FROM page WHERE html like ‘%about%’ UNION
  SELECT title, html, 5 AS relevance FROM page WHERE keywords like ‘%about%’ UNION
  SELECT title, html, 2 AS relevance FROM page WHERE description like ‘%about%’
  ) results
GROUP BY title, html
ORDER BY relevance desc;

Я получаю:

domain1 title html
domain1 title html
domain1 title html
domain2 title html
domain2 title html
domain2 title html

То, что я хочу, это

domain1 title html
domain2 title html
domain3 title html
domain4 title html
domain5 title html

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Я не уверен, почему ваш код даже работает, так как я думаю, что вы должны иметь

ORDER BY Sum(relevance) DESC

вместо

ORDER BY relevance DESC

Может быть, в этом проблема?

Помимо этого, как насчет этого? Это некрасиво, но это сработает. Было бы лучше, если бы SQL Server понимал, как ссылаться на псевдонимы позже в запросе. Но увы.

SELECT title, html,
Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End AS relevance
FROM page
WHERE Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End > 0
ORDER BY Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End DESC;

Или, может быть, просто небольшая перестановка:

SELECT title, html, relevance
FROM (SELECT title, html,
Case When title LIKE '%about%' Then 10 Else 0 End +
Case When html LIKE '%about%' Then 7 Else 0 End +
Case When keywords LIKE '%about%' Then 5 Else 0 End +
Case When description LIKE '%about%' Then 2 Else 0 End AS relevance
FROM page)
WHERE relevance > 0
ORDER BY relevance DESC;
0 голосов
/ 29 июля 2010

Соответствие ORDER BY приводит к тому, что ваш запрос ведет себя так, как если бы релевантность (не агрегированная) была в предложении SELECT.Эрик прав - сумма ORDER BY (релевантность) должна исправить вашу ошибку.

...