Grup

2010-07-26 24 views
7

'dan Maksimum Sınır 1'i seçin. Web sayfası önbellek sistemi yapıyorum. Çıktı ile birlikte basit bir sayfa sıralama sistemi yapmak istedim. Sorun şu ki, kayıt kümesini benzersiz alan başına en yüksek alaka düzeyiyle göstermek istiyorum. Bir alan adında birden fazla kayıt olabilir, ancak farklı başlıklar, açıklamalar vb. Olabilir. Sorun, benzersiz bir etki alanı içeren 1 kayıt kümesi almak yerine, söz konusu benzersiz alanın tüm kayıt kümelerini gruplandırır ve hepsini çıkış olarak verir.Grup

domain1 title html 
domain1 title html 
domain1 title html 
domain2 title html 
domain2 title html 
domain2 title html 
: ben alıyorum (o grup için en yüksek alaka ve farklı domain)

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; 

sonraki çıkışı önce sadece grup başına benzersiz etki alanı başına en yüksek alaka skoru recordset istiyorum

istediğim şey, sen gerektiğini düşünüyorum çünkü ben, senin kod bile çalışır neden emin değilim

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

cevap

2

olduğunu

yerine

 
ORDER BY relevance DESC 

arasında

 
ORDER BY Sum(relevance) DESC 

Belki sorun da bu zaten? Bunun ötesinde, buna ne dersiniz? Çirkin, ama işe yarayacak. SQL Server, sorgunun daha sonra diğer adlara nasıl başvurulacağını anladığında daha iyi olurdu. Ama alas.

 
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; 

Ya da belki sadece hafif bir yeniden düzenleme: alaka TARAFINDAN

 
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

Bunu hangi şekilde yaparsam yapay sütun 'alaka düzeyi' – Patriotec

+1

@kinjite olsun: Buradaki "alaka düzeyi" WHERE ifadesinde başvurulan bir sütun diğer adıdır. SQL Server, GROUP BY'deki sütun takma adlarını başvuruyor, ancak WHERE –

+0

@OMG Ponies: veya doğru şekilde çağırıyorsa, ORDER BY değerini desteklemiyor. Bunu düzeltmek için cevabı düzenledim. Çok çirkin ama işe yarayacak. Bu hack'i daha önce kullandım. –

0

SİPARİŞ alaka (toplu olmayan) SELECT yan tümcesinde sanki davranmaya Sorgunuzla neden oluyor. Erick haklı - ORDER BY sum (alaka düzeyi) hatalarınızı düzeltmelidir.