Приоритет SQL-запроса с несколькими ИЛИ - PullRequest
3 голосов
/ 06 сентября 2011

У меня есть два столбца: имя, фамилия (имя, фамилия)

В запросе попробуйте полное имя (например, Стив Джобс), затем я делю слова на переменные (в 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 ]

2 голосов
/ 06 сентября 2011

Ни таблицы, ни запросы 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 голосов
/ 06 сентября 2011

попробуйте это:

          (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 голос
/ 06 сентября 2011
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
1 голос
/ 06 сентября 2011

Вы всегда можете добавить еще одну строку таблицы и сделать ее индексом приоритета, например:

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

Вот так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...