MySQL第一个条件匹配优先级

标签 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%'

的数据

如果有任何结果 fromid1992 值匹配,则返回此结果,并忽略第二个条件

但如果第一个条件 (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/

相关文章:

Qt 上未加载 MySQL 驱动程序

javascript - 在 JSON 脚本中格式化日期时间

php - 在mysql php中获取真假结果

r - "If (FALSE)"没有明确说明条件

r - 否则 : combine 3 categories into one

sql - 如何获取最后一个条件=注册的数据?

php - 在 Laravel/Eloquent 中查询多个嵌套关系

使用向下应用行时的 R 引用列

mysql - FIND_IN_SET 在列上?是否有意义?

MySQL 在一组值中查找多个结果