Mysql选择与最佳匹配

时间:2015-02-24 10:48:50

标签: mysql sql mysqli

我有这个问题:

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      test@test.com
2      other@test.com

当我像这样运行此查询时:

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      other@test.com
1      test@test.com

问题: 我想要的是:我希望将最佳匹配作为第一个结果,而不使用全文搜索。 这是可能的,如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分: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