簡體   English   中英

如何排序MySQL搜索結果的相關性?

[英]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中?

您可以按usernamename$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM