2010-07-26 29 views
7

से अधिकतम सीमा 1 का चयन करें मैं वेबपृष्ठ कैश सिस्टम में बना रहा हूं। मैं आउटपुट के साथ एक साधारण पेज रैंक सिस्टम बनाना चाहता था। समस्या यह है कि, मैं प्रति अद्वितीय डोमेन के उच्चतम प्रासंगिकता स्कोर के साथ रिकॉर्डसेट प्रदर्शित करना चाहता हूं। एक डोमेन में एकाधिक रिकॉर्ड हो सकते हैं लेकिन अलग-अलग शीर्षक, विवरण इत्यादि के साथ समस्या यह है कि, एक अद्वितीय डोमेन वाले 1 रिकॉर्डसेट प्राप्त करने के बजाय, यह उस अद्वितीय डोमेन के सभी रिकॉर्ड्स को समूहित करता है और उन सभी को आउटपुट करता है। मैं सिर्फ समूह में अद्वितीय डोमेन प्रति उच्चतम प्रासंगिकता स्कोर के साथ 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 

उत्तर

2

है मुझे यकीन है कि क्यों आपके कोड भी काम करता है नहीं कर रहा हूँ के बाद से मुझे लगता है कि आप करना चाहिए था

 
ORDER BY Sum(relevance) DESC 

 
ORDER BY relevance DESC 

के बजाय

हो सकता है कि समस्या क्या है?

इसके अलावा, इसके बारे में क्या। यह बदसूरत है, लेकिन यह काम करेगा। यह बेहतर होगा अगर SQL सर्वर समझ में आया कि क्वेरी में बाद में उपनामों का संदर्भ कैसे दिया जाए। लेकिन अफसोस।

 
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

+1

@kinjite प्राप्त करता रहता हूं: ऐसा इसलिए है क्योंकि 'प्रासंगिकता' एक कॉलम उपनाम है, जहां WHERE खंड में संदर्भित किया गया है। SQL सर्वर ग्रुप BY में कॉलम उपनामों का संदर्भ देने का समर्थन करता है, लेकिन WHERE –

+0

@OMG Ponies: या ORDER BY, अगर मुझे सही याद है। मैंने इसे ठीक करने के लिए जवाब संपादित किया। यह बहुत बदसूरत है, लेकिन यह काम करेगा। मैंने पहले इस हैक का उपयोग किया है। –

0

आदेश प्रासंगिकता के आधार पर व्यवहार करने के लिए के रूप में यद्यपि प्रासंगिकता (गैर-संकलित) SELECT खंड में है आपकी क्वेरी खड़ी कर रहा है। एरिक सही है - राशि (प्रासंगिकता) द्वारा आदेश आपकी गलती को ठीक करना चाहिए।