[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить запрос с приоритетами
Barh
Здравствуйте, форумчане!

Опишу, то что мне нужно получить на примере поиска по БД.

Пользователь вводит в поиск: "инд".
Необходимо выбрать результаты по 3 значениям:
(как ввёл пользователь, в транслите, если забыл переключить раскладку)
('инд', 'ind', 'byl')

Допустим нашлись результаты по всем этим значениям.

Необходимо вывести результаты, в последовательности, максимально релевантно запросу, так: Индия, Индус, Линда, India, Indi, bylt.

Если писать 1 запрос, то я не знаю такой возможности, что бы сделать это средствами MySQL (т.е. он просто пройдёт всю таблицу, и найденное будет вразброс).

Можно написать 3 последовательных запроса и получить нужный результат (что пока я и использую).

Подскажите, как можно реализовать, то что мне необходимо одним запросом?
sergeiss
Наверное, вот так вот (внимательно следи за мыслью).

1. Тебе нужно объединить эти запросы в один посредством UNION.
2. Добавь дополнительную колонку, значение в которой показывает, к какому из запросов относится результат.
3. Отсортируй в нужном порядке, используя как основные колонки, так и введенную тобой дополнительную.


Примерно так (ord - это самое дополнительное поле, fieldN - твои поля):

select * from
(select 1 as ord, field1, .... field N
from .... where ...условие для русского..

UNION

select
2 as ord, field1, .... field N
from .... where ...условие для транслита..

UNION

select
3 as ord, field1, .... field N
from .... where ..условие для неверной раскладки...
)
ini_sel
order by field1, ord


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Barh
sergeiss, спасибо огромное за наводку.

В итоге попробовал написать ваш код, и всё получилось:
select * from
(
SELECT 1 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%ind%'
UNION
SELECT 2 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%инд%'
) as `result`


Результаты идут в необходимом мне порядке. Плюс ещё можно отсортировать, как мне необходимо!) То что и хотел.

Только добавил алиас.
Без 'as `result`' выдавал ошибку: Every derived table must have its own alias.
sergeiss
Цитата (Barh @ 20.09.2013 - 22:49)
Только добавил алиас.

Алиас у меня был написан, ini_sel. Только да, он был написан "в стиле Постгрес" (не обязательно писать AS), а не Мускуля smile.gif

Насчет твоего запроса: зачем ты в обоих подзапросах назначаешь одно и то же число 1 для ord? Тут суть именно в том, что они разные. Или это при выводе на форум ты ошибся?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Barh
sergeiss, теперь понятно стало, что за ini_sel :) Одинаковый ord написал ошибочно при вводе на форум. Своё предыдущее сообщение отредактировал, исправил ord.


Возник ещё один вопрос. Допустим пишу такой зпрос:
select * from
(
SELECT 1 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%ind%'
UNION
SELECT 2 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%ind%'
) as `result`

Умышленно ставлю условие "WHERE LIKE '%ind%'" одно и тоже. Получаю дублирующиеся результаты.
А в таблице данные могут быть длинные (около 50-80 символов) и порой находятся те же строки, но по разным запросам.

Если убрать 1 as `ord` и 2 as `ord`, то дубликаты удаляются.. А мне бы надо бы сохранить эти числа и удалить дубликаты оставляя строку с наименьшим ord. Как-то можно это сделать?


P.S. Решил вопрос так:
select * from
(
SELECT 1 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%ind%'
UNION
SELECT 2 as `ord`, `id`, `lastname` FROM `table_1` WHERE `lastname` LIKE '%ind%'
) as `result` group by `id`

т.е. добавил group by `id`. И больше нет дублей. Но! Подскажите это оптимальный вариант?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.