2010-07-26 44 views
7

Tôi đang tạo hệ thống bộ nhớ cache trong trang web. Tôi muốn tạo một hệ thống xếp hạng trang đơn giản cùng với đầu ra. Vấn đề là, tôi muốn hiển thị recordset với điểm liên quan cao nhất cho mỗi miền duy nhất. Một miền có thể có nhiều bản ghi nhưng với các tiêu đề, mô tả khác nhau, vv Vấn đề là, thay vì nhận 1 bản ghi có chứa một tên miền duy nhất, nó nhóm tất cả các bản ghi của tên miền duy nhất đó và xuất tất cả chúng. Tôi chỉ muốn recordset với số điểm cao nhất phù hợp cho mỗi tên miền độc đáo cho mỗi nhóm trước khi nó kết quả đầu ra (miền và khác nhau với sự liên quan cao nhất cho nhóm đó) bên cạnhChọn Giới hạn tối đa 1 từ nhóm

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; 

tôi nhận được:

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

Những gì tôi muốn là

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

Trả lời

2

tôi không chắc chắn lý do tại sao mã của bạn thậm chí làm việc, kể từ khi tôi nghĩ rằng bạn nên có

 
ORDER BY Sum(relevance) DESC 

thay vì

 
ORDER BY relevance DESC 

Có lẽ đó là vấn đề?

Ngoài ra, còn về điều này. Nó xấu, nhưng nó sẽ hoạt động. Sẽ tốt hơn nếu SQL Server hiểu cách đề cập đến các bí danh sau này trong truy vấn. Nhưng than ôi.

 
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; 

Hoặc có thể chỉ là một sự sắp xếp lại nhẹ:

 
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

Không có vấn đề gì tôi làm điều này tôi tiếp tục nhận được cột không hợp lệ 'liên quan' – Patriotec

+1

@kinjite: Đó là vì 'liên quan' là một bí danh cột, được tham chiếu trong mệnh đề WHERE. SQL Server hỗ trợ tham chiếu các bí danh cột trong GROUP BY, nhưng không phải là WHERE –

+0

@OMG Ponies: hoặc ORDER BY, nếu tôi nhớ chính xác. Tôi đã chỉnh sửa câu trả lời để sửa lỗi này. Nó rất xấu, nhưng nó sẽ hoạt động. Tôi đã sử dụng hack này trước đây. –

0

ORDER BY liên quan đang gây ra truy vấn của bạn cư xử như thể phù hợp (không cộng dồn) là trong mệnh đề SELECT. Erick là đúng - ORDER BY tổng (liên quan) nên sửa chữa sai lầm của bạn.

Các vấn đề liên quan