Я делаю в системе кэша веб-страницы. Я хотел заставить простую страницу оценить систему наряду с выводом. Проблема, я хочу отобразить recordset с самым высоким счетом уместности на уникальный домен. Один домен может иметь несколько записей, но с различными заголовками, описаниями, и т.д. Проблема, вместо того, чтобы получить 1 recordset, содержащий уникальный домен, это группирует весь recordsets того уникального домена и производит их всех. Я просто хочу recordset с самым высоким счетом уместности на уникальный домен на группу, прежде чем это произведет следующее (и другой домен с самой высокой уместностью для той группы)
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
Я не уверен, почему ваш код вообще работает, поскольку я думаю, что у вас должно быть
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;
ORDER BY relevance заставляет ваш запрос вести себя так, как будто релевантность (не агрегированная) находится в предложении SELECT. Erick прав - ORDER BY sum(relevance) должен исправить вашу ошибку.