2016-06-24 110 views
0

我正在使用PDO在搜索結果中搜索MySQL表。我的查詢看起來像這樣如何將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

獅身人面像使用該搜索檢索EN gine,並且您可以輕鬆設置按相關性進行排序,因爲相關性搜索結果是由點擊鏈接排序。 – Naumov

+0

試試這個。改變查詢中的順序:** $ SQL =「SELECT * FROM users WHERE username LIKE:username OR name LIKE:name ORDER BY name LIKE:name DESC,uniqueid DESC LIMIT 6」; ** –

回答

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 
+0

非常感謝,但是這不算作兩個查詢嗎?或者速度和性能的影響最小? –

+0

@ 15KanurajBeri不,這算作一個查詢。速度和性能並不是一件簡單的事 - 它取決於你的特定情況,即原始數據的大小。一般來說,對於小數據集來說並不重要。 –

+0

謝謝。你的回答很完美。如果我想先向您展示您關注的人,它也會在稍後留出空間。公認。 –

1

你可以通過訂購的$query指數的結果usernamename

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

注意,但是,排序由函數的結果,需要在MySQL全表掃描。

+0

非常感謝!但是,這個特定的查詢似乎沒有工作。你能幫我一下嗎?感謝您花時間幫助PHP新手。 –

-1

您可以輕鬆使用此查詢:

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

我不知道你爲什麼downvote這個答案它很有效。 –

相關問題