我如何排序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.'%');

我想要完成的是在我的结果数组中,结果匹配如下:

$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

在这种情况下,Eugene的回答似乎是最合适的。下面提供的是该问题的另一种解决方案,它允许在排序结果方面进行进一步定制:

如果你有这样的数据:

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

您可以很容易地使用这个查询:

$SQL = "SELECT * FROM users WHERE username LIKE :username OR name LIKE :name ORDER BY name LIKE :name DESC, uniqueid DESC LIMIT 6"; –