Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Помогите составить запрос с приоритетами, Нужна определенная последовательность найденных строк
Barh  
 ۩     Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 80
Пользователь №: 31275
На форуме: 4 года, 10 месяцев, 9 дней
Карма: 1




Здравствуйте, форумчане!

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

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

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

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

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

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

Подскажите, как можно реализовать, то что мне необходимо одним запросом?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14975
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 2 дня
Карма: 444




Наверное, вот так вот (внимательно следи за мыслью).

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


Это сообщение отредактировал sergeiss - 20.09.2013 - 21:49


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

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

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

user posted image
PMICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Barh  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 80
Пользователь №: 31275
На форуме: 4 года, 10 месяцев, 9 дней
Карма: 1




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.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14975
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 2 дня
Карма: 444




Цитата (Barh @ 20.09.2013 - 22:49)
Только добавил алиас.

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

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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Barh  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 80
Пользователь №: 31275
На форуме: 4 года, 10 месяцев, 9 дней
Карма: 1




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`. И больше нет дублей. Но! Подскажите это оптимальный вариант?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса