2010-07-20 26 views
7

Vui lòng giúp tôi tạo truy vấn chọn chứa mệnh đề 'where' và thứ tự sẽ như sau: kết quả sẽ được hiển thị theo thứ tự của hầu hết từ khóa (nơi điều kiện) phù hợp với ít nhất phù hợp.Đặt hàng theo Điều kiện tối đa phù hợp

LƯU Ý: tất cả 10 điều kiện đều có "HOẶC".

Vui lòng giúp tôi tạo truy vấn này. tôi đang sử dụng ms-sql server 2005

Giống như:

Select * 
    from employee 
where empid in (1,2,4,332,434) 
    or empname like 'raj%' 
    or city = 'jodhpur' 
    or salary >5000 

Trong truy vấn trên tất cả những kỷ lục mà phù hợp với điều kiện tối đa nên được trên đầu và ít phù hợp với kỷ lục điều kiện nên ở phía dưới.

+0

Bạn có thể đưa ra ví dụ về truy vấn bạn đang sử dụng không? –

+0

Một số lược đồ mẫu sẽ hữu ích. –

Trả lời

12
SELECT * 
    FROM (SELECT (CASE WHEN cond1 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       CASE WHEN cond2 THEN 1 ELSE 0 END + 
       ... 
       CASE WHEN cond10 THEN 1 ELSE 0 END 
       ) AS numMatches, 
       other_columns... 
      FROM mytable 
     ) xxx 
WHERE numMatches > 0 
ORDER BY numMatches DESC 
+0

Điều đó cũng hoạt động tốt. – Tobiasopdenbrouw

+0

trông tuyệt vời, tôi không biết làm thế nào để làm điều này với doctrine + symfony: D –

+0

Điều này cần phải có trong sách giáo khoa SQL. –

2

EDIT: Câu trả lời này đã được đăng trước khi câu hỏi được sửa đổi với ví dụ cụ thể. Marcelo's solution giải quyết vấn đề thực tế. Mặt khác, câu trả lời của tôi là ưu tiên cho các trận đấu của các lĩnh vực cụ thể.


Bạn có thể muốn thử một cái gì đó như sau, sử dụng các từ ngữ tương tự trong mệnh đề ORDER BY như tại khoản WHERE của bạn:

SELECT * 
FROM  your_table 
WHERE  field_1 = 100 OR 
      field_2 = 200 OR 
      field_3 = 300 
ORDER BY field_1 = 100 DESC, 
      field_2 = 200 DESC, 
      field_3 = 300 DESC; 

tôi vừa mới trả lời một câu hỏi tương tự trên Stack Overflow mà bạn có thể quan tâm kiểm tra ra:

+0

Thao tác này không theo thứ tự số trận đấu. –

+0

Vâng, đó là sự thật. Nó không rõ ràng trong câu hỏi ban đầu ... Tôi đang cố gắng để xem nếu tôi có thể thích ứng với câu trả lời của tôi. –

0

Có nhiều tùy chọn/câu trả lời có thể. Câu trả lời tốt nhất phụ thuộc vào kích thước của dữ liệu, các yêu cầu phi chức năng vv

Điều đó nói rằng, những gì tôi sẽ làm là một cái gì đó như thế này (dễ đọc/debug):

Select * from 
    (Select *, iif(condition1 = bla, 1, 0) as match1, ..... , match1+match2...+match10 as totalmatchscore from sourcetable 
    where 
     condition1 = bla or 
     condition2 = bla2 
     ....) as helperquery 
    order by helperquery.totalmatchscore desc 
+1

Sử dụng giải pháp của Marcelo. – Tobiasopdenbrouw

0

tôi không thể có được điều này để làm việc cho tôi trên Oracle. Nếu sử dụng oracle, thì Order by Maximum condition match là một giải pháp tốt. Sử dụng trường hợp khi tính năng ngôn ngữ

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