2015-02-24 65 views
2

我有這個疑問:Mysql的選擇最佳匹配與像

SELECT `id` FROM `accounts` 
WHERE AES_DECRYPT(`email`, :salt) = CONCAT_WS('@',:mailbox,:host) 
OR AES_DECRYPT(`email`, :salt) LIKE CONCAT('%',:host) 

我有2個記錄在該表:

id  email 
1  [email protected] 
2  [email protected] 

當我運行此查詢是這樣的:

SELECT `id` FROM `accounts` 
WHERE AES_DECRYPT(`email`, '123') = CONCAT_WS('@','test','test.com') 
OR AES_DECRYPT(`email`, '123') LIKE CONCAT('%','test.com') 

我得到這個結果:

id  email 
2  [email protected] 
1  [email protected] 

問: 我想是這樣的:我想擁有最佳匹配作爲第一個結果,而無需使用全文搜索。 這是可能的,如果是這樣,我該怎麼做?

+0

最佳匹配是什麼意思? – 2015-02-24 10:56:07

+1

當我搜索[email protected]時,我想將[email protected]作爲第一個結果。 [email protected]比[email protected]有更好的匹配。我希望結果中最匹配的字符最終排在最前面。 – SheperdOfFire 2015-02-24 10:58:36

+0

不好意思說,這對我來說看起來很奇怪。所以[email protected]比[email protected]更好?當尋找Gmail時,[email protected]和[email protected]一樣好?而[email protected]與[email protected]一樣好?我認爲你應該改進你的規則,然後回到這裏。 – 2015-02-24 11:17:41

回答

0

你可以很容易地訂購的結果通過匹配的數目:

SELECT `id` 
FROM `accounts` 
WHERE AES_DECRYPT(`email`, '123') = CONCAT_WS('@', 'test', 'test.com') OR 
     AES_DECRYPT(`email`, '123') LIKE CONCAT('%','test.com') 
ORDER BY ((AES_DECRYPT(`email`, '123') = CONCAT_WS('@', 'test', 'test.com')) + 
      (AES_DECRYPT(`email`, '123') LIKE CONCAT('%','test.com')) 
     ); 

這會爲你的工作,例如。

+1

謝謝,這是工作確實。 – SheperdOfFire 2015-02-24 11:39:17

0

要按特定順序獲取記錄,請使用ORDER BY子句。

SELECT `id` FROM `accounts` 
WHERE AES_DECRYPT(`email`, :salt) = CONCAT_WS('@',:mailbox,:host) 
OR AES_DECRYPT(`email`, :salt) LIKE CONCAT('%',:host) 
order by AES_DECRYPT(`email`, :salt) = CONCAT_WS('@',:mailbox,:host) desc; 

這裏我們使用的是一個特殊的MySQL。布爾表達式的計算結果爲TRUE結果在1計算結果爲FALSE的結果爲0布爾表達式在另一個DBMS你可以寫這個:

order by 
case when AES_DECRYPT(`email`, :salt) = CONCAT_WS('@',:mailbox,:host) 
     then 1 else 0 end desc; 
0

此代碼應該適合你:

SELECT `id` FROM `accounts` 
    WHERE AES_DECRYPT(`email`, :salt) = CONCAT_WS('@',:mailbox,:host) 
    OR AES_DECRYPT(`email`, :salt) LIKE CONCAT('%',:host) 
    ORDER BY LENGTH(`email`) - LENGTH(REPLACE(`email`, :host, '')) - LENGTH(REPLACE(`email`, :mailbox, '')) DESC