2010-08-31 50 views
20

cho rằng chúng tôi đang thực hiện các từ khóa tìm kiếm sử dụng: KEYWORD1, KEYWORD2, KEYWORD3Mysql: Sắp xếp theo như thế nào?

có bản ghi trong cơ sở dữ liệu với cột "Tên":

 
1: John Doe 
2: Samuel Doe 
3: John Smith 
4: Anna Smith 

tại Query:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%") 

nó sẽ chọn hồ sơ: 1,2,3 (theo thứ tự này) nhưng tôi muốn đặt hàng theo từ khóa trong ví dụ keyword1=John, keyword2=Doe vì vậy nó sẽ được liệt kê theo từ khóa: 1,3,2 (vì tôi muốn thực hiện tìm kiếm "Doe" sau khi tìm kiếm "John")

Tôi đã suy nghĩ về SELECT DISTINCT FROM (...... UNION .....) nhưng sẽ dễ dàng hơn khi đặt hàng bằng cách khác (truy vấn thực là thực sự dài)

có bất kỳ thủ thuật nào để tạo thứ tự như vậy không?

Trả lời

46
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%" then 2 
    else 3 
end 
+0

có, hoạt động, cảm ơn bạn :) – dfens

+0

một điều nữa - nếu tôi hiểu đúng thì mỗi LIKE sẽ được thực hiện 2 lần trong toàn bộ truy vấn? – dfens

+0

@dfens: Tôi đoán rằng 'LIKE' trong mệnh đề' ORDER BY' sẽ chỉ thực hiện trên dữ liệu được khớp với mệnh đề 'WHERE', vì vậy sẽ nhanh hơn. – RedFilter

2
SELECT * 
from 
(
    SELECT u.*, 1 OrderNum 
    FROM users 
    WHERE (name LIKE "%John%") 
    UNION 
    SELECT u.*, 2 OrderNum 
    FROM users 
    WHERE (name LIKE "%Doe%") 
) 
    Order by OrderNum 
2

Để xây dựng dựa trên câu trả lời RedFilter, bạn có thể làm cho các hàng có cả từ khoá là ở đầu trang:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2 
when name LIKE "%Doe%" then 3 
end 
0

dụ của tôi sẽ theo thứ tự tất cả các John 's thứ tự chữ cái tiếp theo là Doe 'S.

ORDER BY CASE 
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name) 
    WHEN name LIKE "John%" THEN CONCAT('b',name) 
    WHEN name LIKE "%Doe"  THEN CONCAT('c',name) 
    ELSE name 
END 
Các vấn đề liên quan