
![]() |
Здравствуйте Гость ( Вход | Регистрация ) |
|
|
|
![]() ![]() ![]() |
![]() |
|
![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 80 Пользователь №: 31275 На форуме: Карма: 1 ![]() |
Здравствуйте, форумчане!
Опишу, то что мне нужно получить на примере поиска по БД. Пользователь вводит в поиск: "инд". Необходимо выбрать результаты по 3 значениям: (как ввёл пользователь, в транслите, если забыл переключить раскладку) ('инд', 'ind', 'byl') Допустим нашлись результаты по всем этим значениям. Необходимо вывести результаты, в последовательности, максимально релевантно запросу, так: Индия, Индус, Линда, India, Indi, bylt. Если писать 1 запрос, то я не знаю такой возможности, что бы сделать это средствами MySQL (т.е. он просто пройдёт всю таблицу, и найденное будет вразброс). Можно написать 3 последовательных запроса и получить нужный результат (что пока я и использую). Подскажите, как можно реализовать, то что мне необходимо одним запросом? |
![]() |
|
![]() ![]() Сидел он, дум великих полон - и вдаль глядел ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 15860 Пользователь №: 4190 На форуме: Карма: 490 ![]() |
Наверное, вот так вот (внимательно следи за мыслью).
1. Тебе нужно объединить эти запросы в один посредством UNION. 2. Добавь дополнительную колонку, значение в которой показывает, к какому из запросов относится результат. 3. Отсортируй в нужном порядке, используя как основные колонки, так и введенную тобой дополнительную. Примерно так (ord - это самое дополнительное поле, fieldN - твои поля): select * from Это сообщение отредактировал sergeiss - 20.09.2013 - 21:49 -------------------- * Хэлп по PHP
* Описалово по JavaScript * Хэлп и СУБД для PostgreSQL * Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. * "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С) ![]() |
![]() |
۩
Дата
|
![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 80 Пользователь №: 31275 На форуме: Карма: 1 ![]() |
sergeiss, спасибо огромное за наводку.
В итоге попробовал написать ваш код, и всё получилось: select * from Результаты идут в необходимом мне порядке. Плюс ещё можно отсортировать, как мне необходимо!) То что и хотел. Только добавил алиас. Без 'as `result`' выдавал ошибку: Every derived table must have its own alias. |
![]() |
|||
![]() ![]() Сидел он, дум великих полон - и вдаль глядел ![]() ![]() ![]() ![]() ![]() ![]() Профиль Группа: Эксперт ![]() Сообщений: 15860 Пользователь №: 4190 На форуме: Карма: 490 ![]() |
Алиас у меня был написан, ini_sel. Только да, он был написан "в стиле Постгрес" (не обязательно писать AS), а не Мускуля ![]() Насчет твоего запроса: зачем ты в обоих подзапросах назначаешь одно и то же число 1 для ord? Тут суть именно в том, что они разные. Или это при выводе на форум ты ошибся? -------------------- * Хэлп по PHP
* Описалово по JavaScript * Хэлп и СУБД для PostgreSQL * Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. * "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С) ![]() |
||
![]() |
۩
Дата
|
![]() Пользователь ![]() ![]() Профиль Группа: Форумчанин ![]() Сообщений: 80 Пользователь №: 31275 На форуме: Карма: 1 ![]() |
sergeiss, теперь понятно стало, что за ini_sel :) Одинаковый ord написал ошибочно при вводе на форум. Своё предыдущее сообщение отредактировал, исправил ord.
Возник ещё один вопрос. Допустим пишу такой зпрос: select * from Умышленно ставлю условие "WHERE LIKE '%ind%'" одно и тоже. Получаю дублирующиеся результаты. А в таблице данные могут быть длинные (около 50-80 символов) и порой находятся те же строки, но по разным запросам. Если убрать 1 as `ord` и 2 as `ord`, то дубликаты удаляются.. А мне бы надо бы сохранить эти числа и удалить дубликаты оставляя строку с наименьшим ord. Как-то можно это сделать? P.S. Решил вопрос так: select * from т.е. добавил group by `id`. И больше нет дублей. Но! Подскажите это оптимальный вариант? |
![]() |
![]() ![]() ![]() |