我有这个问题:
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
问题: 我想要的是:我希望将最佳匹配作为第一个结果,而不使用全文搜索。 这是可能的,如果是这样,我该怎么做?
答案 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