2010-07-26 80 views
7

我正在制作一个网页缓存系统。我想做一个简单的页面排名系统和输出。问题是,我想显示每个唯一域的相关性分数最高的记录集。一个域可能有多个记录,但具有不同的标题,描述等。问题是,不是获取包含唯一域的1个记录集,而是将该唯一域的所有记录集分组并将其全部输出。我只是想,每组每唯一的域的最高相关性得分记录其输出先下一(相关性最高和不同的领域为该组)从组中选择最大限制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

我不知道为什么你的代码甚至工作,因为我想你应该有

 
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

无论我采用哪种方式,我都会收到无效列'相关性' – Patriotec 2010-07-26 03:44:30

+1

@kinjite:这是因为'相关性'是列别名,在WHERE子句中引用。 SQL Server支持在GROUP BY中引用列别名,但不支持WHERE – 2010-07-26 04:19:01

+0

@OMG Ponies:或ORDER BY,如果我正确记得。我编辑了答案来解决这个问题。这非常丑陋,但它会起作用。我之前使用过这种黑客技术。 – 2010-07-26 11:30:40

0

ORDER BY相关性导致您的查询的行为就好像关联(非聚合)是SELECT子句。埃里克是正确的 - ORDER BY sum(相关性)应该修复你的错误。