我有两列: 姓名(姓名,姓氏)
在查询中,尝试使用全名(例如:史蒂夫·乔布斯),然后将单词划分为变量(在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
如何确定查询的优先顺序并返回史蒂夫·乔布斯的案例?
答案 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