具有多个OR的SQL查询的优先级

时间:2011-09-06 17:54:53

标签: mysql sql

我有两列: 姓名(姓名,姓氏)

在查询中,尝试使用全名(例如:史蒂夫·乔布斯),然后将单词划分为变量(在php中)并执行查询:

SELECT * FROM `usuarios` WHERE 
(`nome` REGEXP '$bt1 $bt2') OR 
(`nome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1') OR
(`sobrenome` REGEXP '$bt1 $bt2')

问题是结果显示不符合查询顺序,最后返回:

Steve John
John Jobs
Steve Jobs

如何确定查询的优先顺序并返回史蒂夫·乔布斯的案例?

4 个答案:

答案 0 :(得分:2)

试试这个:

          (SELECT '1' as sb, usuarios.* FROM usuarios WHERE nom` REGEXP '$bt1 $bt2')
UNION ALL (SELECT '2' as sb, usuarios.* FROM usuarios WHERE nome REGEXP '$bt1')
UNION ALL (SELECT '3' as sb, usuarios.* FROM usuarios WHERE sobrenome REGEXP '$bt1')
UNION ALL (SELECT '4' as sb, usuarios.* FROM usuarios WHERE sobrenome REGEXP '$bt1 $bt2')
ORDER BY sb

答案 1 :(得分:2)

这两个表都不是SQL查询都有默认顺序。这是设计的。如果您需要特定订单,则必须提供ORDER BY条款;否则,行以任意顺序返回(甚至不是随机的!)。

在你的情况下,如果我明白你的意思:

SELECT *
FROM usuarios
WHERE 
    nome REGEXP '$bt1 $bt2' OR 
    nome REGEXP '$bt1' OR 
    sobrenome REGEXP '$bt1' OR
    sobrenome REGEXP '$bt1 $bt2'
ORDER BY CASE
    WHEN nome REGEXP '$bt1 $bt2' THEN 1
    WHEN nome REGEXP '$bt1' THEN 2
    WHEN sobrenome REGEXP '$bt1' THEN 3
    WHEN sobrenome REGEXP '$bt1 $bt2' THEN 4
END

(我也删除了多余的引号和括号;不是错误,只是一个小小的烦恼)。

答案 2 :(得分:1)

您始终可以添加另一个表行,并将其作为优先级的索引,如:

SELECT * FROM `usuarios` WHERE  
(`nome` REGEXP '$bt1 $bt2') OR  
(`nome` REGEXP '$bt1') OR  
(`sobrenome` REGEXP '$bt1') OR 
(`sobrenome` REGEXP '$bt1 $bt2') 
ORDER BY `priority` ASC

就像那样!

答案 3 :(得分:1)

SELECT usuarios.*
FROM (
   ( 1 AS column, '$bt1 $bt2' AS pattern, 0 AS priority ) UNION
   ( 1, '$bt1', 1 ) UNION
   ( 2, '$bt1', 2 ) UNION
   ( 2, '$bt1 $bt2', 3 )
) AS items,
INNER JOIN usuarios
ON( ELT(items.column, usuarios.nome, usuarios.sobrenome) REGEXP items.pattern )
ORDER BY items.priority