我有这个数据
+----+--------+---------------------------------+ | id | fromid | message | +----+--------+---------------------------------+ | 1 | 1213 | this is just an example | +----+--------+---------------------------------+ | 2 | 1992 | other random message | +----+--------+---------------------------------+ | 3 | 1364 | example number three | +----+--------+---------------------------------+
我需要搜索 fromid='1992'
或 message LIKE '%example%'
如果有任何结果 fromid
与 1992
值匹配,则返回此结果,并忽略第二个条件
但如果第一个条件 (fromid='1992'
) 没有结果,则返回第二个条件的结果
我可以在单个查询中执行此操作吗?
最佳答案
一种方法是使用标记,然后将结果限制为第一行。使用 UNION 的示例:-
SELECT 1 AS match_type, my_table.*
from my_table
where fromid = 1992
UNION
SELECT 2 AS match_type, my_table.*
from my_table
WHERE message like '%example%'
ORDER BY match_type
LIMIT 1
这样做的缺点是,它仍然强制使用带有前导通配符的 LIKE 进行相对较慢的非索引查询。
以下是替代方案。在大多数情况下,这是毫无意义的,但是如果期望对 id 的检查几乎总是返回一条记录,而对 LIKE 的检查只是一个非常偶然的情况(仅返回一条记录),那么它可能是值得的,因为除非必要,否则它将避免搜索慢速的 LIKE 条件。
SELECT COALESCE(id, SELECT MAX(id) from my_table WHERE message like '%example%') AS id,
COALESCE(fromid, SELECT MAX(formed) from my_table WHERE message like '%example%') AS formed,
COALESCE(message, SELECT MAX(message) from my_table WHERE message like '%example%') AS message
FROM
(
SELECT id, fromid, message
FROM (SELECT 1 AS a_cnt) sub0
LEFT OUTER JOIN
(
SELECT id, fromid, message
from my_table
where fromid = 1992
) sub1
) sub2
关于MySQL第一个条件匹配优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088754/