[英]How do I sort MySQL search results be relevance?
我正在使用PDO在MySQL表中搜索搜索結果。 我的查詢看起來像這樣
$sql = "SELECT * FROM users WHERE username LIKE :username OR name LIKE :name ORDER BY uniqueid DESC LIMIT 6";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':username', '%'.$query.'%');
$stmt->bindValue(':name', $query.'%');
我要完成的是在我的results數組中,匹配的結果如下:
$query.'%'
應該出現在符合以下條件的結果之前:
'%'.$query.'%'
有沒有一種方法可以按這種相關性對結果進行排序,而無需兩個查詢,最好是在純SQL中?
您可以按username
和name
中$query
的索引對結果進行排序:
SELECT * FROM users
WHERE username LIKE :username OR name LIKE :name
ORDER BY uniqueid DESC, INSTR(:query, username), INSTR(:query, name) LIMIT 6
但是請注意,按函數結果排序需要在MySQL中進行全表掃描。
您可以輕松使用以下查詢:
$SQL = "SELECT * FROM users WHERE username LIKE :username OR name LIKE :name ORDER BY name LIKE :name DESC, uniqueid DESC LIMIT 6"; –
好吧,在這種情況下,尤金的答案似乎是最合適的。 下面提供的是一般問題的替代解決方案,它允許在排序結果方面進行進一步的自定義:
如果您有這樣的數據:
Id Name
1 Aabbee
2 Aabriella
3 Aada
4 bahlelah
5 cailelah
6 daielah
7 gaisha
8 Aisha
9 Aishath
10 dalelh
11 Eleasha
然后,您可以使用以下查詢:
select '1' as Relevance,ID, Name from MyTable where Name like 'el%' /*The results with the priority (or relevance) should be first */
union
select '2' as Relevance,ID, Name from MyTable where Name like '%el%' and Name not like 'el%' /* The lower priority results go here*/
order by Relevance
這將導致:
Relevance ID Name
1 11 Eleasha
2 2 Aabriella
2 4 bahlelah
2 5 cailelah
2 6 daielah
2 10 dalelh
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.