MySQL第一个条件匹配优先级

时间:2018-04-29 16:19:14

标签: mysql if-statement where-clause

我有这个数据

+----+--------+---------------------------------+
| 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')没有结果,则返回第二个条件的结果

我可以在单个查询中执行此操作吗?

1 个答案:

答案 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