如何对MySQL搜索结果进行排序?

时间:2016-06-24 13:59:52

标签: php mysql sql pdo

我正在使用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中?

3 个答案:

答案 0 :(得分:1)

您可以按$queryusername中的name索引订购结果:

SELECT * FROM users
    WHERE username LIKE :username OR name LIKE :name
ORDER BY uniqueid DESC, INSTR(:query, username), INSTR(:query, name) LIMIT 6

但请注意,按函数结果排序需要在MySQL中进行全表扫描。

答案 1 :(得分:0)

您可以轻松使用此查询:

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

答案 2 :(得分:0)

嗯,在这种情况下,尤金的回答似乎最合适。下面提供了对该问题的替代解决方案,其允许在对结果进行排序方面进一步定制:

如果你有这样的数据:

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