我正在使用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中?
答案 0 :(得分:1)
您可以按$query
和username
中的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