2010-07-26 24 views
7

Estoy creando un sistema de caché de página web. Quería hacer un sistema simple de clasificación de página junto con la salida. El problema es que quiero mostrar el conjunto de registros con el puntaje de relevancia más alto por dominio único. Un dominio puede tener múltiples registros pero con diferentes títulos, descripciones, etc. El problema es que, en lugar de obtener 1 conjunto de registros que contiene un dominio único, agrupa todos los conjuntos de registros de ese dominio único y los emite todos. Sólo quiero que el conjunto de registros con la puntuación más alta relevancia por dominio único para cada grupo antes de indicar la siguiente (y diferente dominio con la más alta relevancia para ese grupo)Seleccionar límite máx. 1 del grupo

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; 

que estoy recibiendo:

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

Lo que quiero es

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

Respuesta

2

no estoy seguro de por qué su código funciona incluso, ya que cree que debería tener

 
ORDER BY Sum(relevance) DESC 

en lugar de

 
ORDER BY relevance DESC 

Tal vez ese es el problema?

Más allá de eso, ¿qué tal esto? Es feo, pero funcionará. Sería mejor si SQL Server entendiera cómo hacer referencia a los alias más adelante en la consulta. Pero Ay.

 
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; 

O tal vez sólo un ligero reordenamiento:

 
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

No importa en qué forma hago esto, sigo obteniendo la columna 'relevancia' no válida – Patriotec

+1

@kinjite: Se debe a que 'relevance' es un alias de columna, al que se hace referencia en la cláusula WHERE. SQL Server admite la referencia de alias de columna en GROUP BY, pero no WHERE –

+0

@OMG Ponies: o ORDER BY, si no recuerdo mal. Edité la respuesta para arreglar esto. Es muy feo, pero funcionará. He usado este truco antes. –

0

Ordenar por relevancia está causando su consulta a comportarse como si relevancia (no agregado) se encuentra en la cláusula SELECT. Erick tiene razón: ORDEN POR suma (relevancia) debería corregir su error.

Cuestiones relacionadas