admin

MySQL选择最佳匹配

sql

我有这个查询:

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

问题: 我想要的是:我希望在不使用全文搜索的情况下将最佳匹配作为第一个结果。如果可以,我该怎么办?


阅读 157

收藏
2021-06-07

共1个答案

admin

您可以根据匹配数轻松地对结果进行排序:

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'))
         );

这将为您的示例工作。

2021-06-07