我有这个数据
+----+--------+---------------------------------+ | 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'
)没有结果,则返回第二个条件的结果
我可以在单个查询中执行此操作吗?
答案 0 :(得分:0)
一种方法是使用标记,然后将结果限制在第一行。使用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