Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Упорядочить выборку не имея явного критерия


Автор: Wolf1994 11.5.2008, 15:41
Есть запрос, типа:

Код

SELECT * FROM `table` WHERE `id` IN (1,3,2)

Как выбрать из БД поля в данном порядке (1,3,2)?

С приведённым запросом получается порядок: 1,2,3.

Автор: skyboy 11.5.2008, 16:05
укажи поля явно!
очень надеюсь, что конструкцией 
Цитата(Wolf1994 @  11.5.2008,  14:41 Найти цитируемый пост)
WHERE `id` IN (1,3,2)

ты не пытался определить последовательность полей в результате, ведь эта конструкция делает совсем другое

Автор: Fortop 11.5.2008, 16:08
skyboy, явное указание полей ему не поможет.
Ему скорее всего нужен не порядок полей, а сортировка результирующих записей.

И если у него нет другого индекса по какому-либо полю, то вывести в таком виде 1,3,2 - можно только случайно.

Автор: Wolf1994 11.5.2008, 16:09
Цитата(skyboy @  11.5.2008,  16:05 Найти цитируемый пост)
укажи поля явно!

Как это сделать? OR?

Добавлено @ 16:10
Fortop, то есть задача нерешаема?

Автор: Fortop 11.5.2008, 16:15
Wolf1994
Для начала нужно понять что ты хочешь smile

Вот таблица

Код

id Б С Д
1  К К К
2  В В В
3  У У У

переставить местами столбцы id, Б, С, Д - можно
а вот строки 1,2,3 - только сортировкой по какому-либо столбцу или нескольким сразу.

Почему тебе надо вывести именно так?
Код

id Б С Д
1  К К К
3  У У У
2  В В В

Чем отличаются между собой записи?

Автор: skyboy 11.5.2008, 16:42
Цитата(Fortop @  11.5.2008,  15:15 Найти цитируемый пост)
вот строки 1,2,3 - только сортировкой по какому-либо столбцу или нескольким сразу.

не, ну для извращенцев можем сортировать по locate(concat(",",id,","),",1,3,2,")  smile 
да, и правда, не сразу понял, что хочет автор. 
Цитата(Wolf1994 @  11.5.2008,  15:09 Найти цитируемый пост)
Fortop, то есть задача нерешаема?

на стороне клиента, обрабатывающего результат выполнения запроса, получи данные в массив - и верти им как угодно. 
только зачем?  smile 

Автор: Wolf1994 11.5.2008, 17:07
Цитата(skyboy @  11.5.2008,  16:42 Найти цитируемый пост)
не, ну для извращенцев можем сортировать по locate(concat(",",id,","),",1,3,2,")  smile 

Спасибо за решение.

Цитата(Fortop @  11.5.2008,  16:15 Найти цитируемый пост)
Почему тебе надо вывести именно так?

Я не силён в MySQL, поэтому решил разложить сложный для меня запрос на части. Результатом выполнения является массив из нескольких отсортированных `id`, по которым надо было получить финальный результат.

Автор: Fortop 11.5.2008, 17:19
Wolf1994, уточни условия задачи.
Возможно она решается совсем другим способом smile

Автор: Akina 11.5.2008, 17:21
Цитата(Wolf1994 @  11.5.2008,  16:41 Найти цитируемый пост)
Как выбрать из БД поля в данном порядке (1,3,2)?

Именно такой порядок записей ведь чем-то обоснован? не идиотским "а вот хочу", а чем-то осмысленным и вменяемым... чем?

Автор: skyboy 11.5.2008, 17:23
черт. а ведь я пошутил :(
Wolf1994, это решение подходит ещё только в том случае, если у тебя количество выбираемых записей 1-10 и по этим записям никакого join'a и прочих операций не происходит.
в противном случае это чревато.
Цитата(Fortop @  11.5.2008,  16:19 Найти цитируемый пост)
Возможно она решается совсем другим способом

не люблю категоричность в высказываниях, но в данном случае, как мне кажется, она непременно решаема другими методами. более быстрыми и менее запутанными

Автор: Wolf1994 11.5.2008, 17:37
Цитата(skyboy @  11.5.2008,  17:23 Найти цитируемый пост)
Wolf1994, это решение подходит ещё только в том случае, если у тебя количество выбираемых записей 1-10 и по этим записям никакого join'a и прочих операций не происходит.

Именно так )

Цитата(Akina @  11.5.2008,  17:21 Найти цитируемый пост)
Именно такой порядок записей ведь чем-то обоснован? не идиотским "а вот хочу", а чем-то осмысленным и вменяемым... чем? 


Цитата(Wolf1994 @  11.5.2008,  17:07 Найти цитируемый пост)
Я не силён в MySQL, поэтому решил разложить сложный для меня запрос на части. Результатом выполнения является массив из нескольких отсортированных `id`, по которым надо было получить финальный результат.


Цитата(Fortop @  11.5.2008,  17:19 Найти цитируемый пост)
Wolf1994, уточни условия задачи.
Возможно она решается совсем другим способом smile 

Мне подошло данное решение. Кажется, оно оптимально для моего случая.

Всем спасибо!

Вопрос решён.

Автор: Fortop 11.5.2008, 21:36
Цитата(Wolf1994 @  11.5.2008,  17:37 Найти цитируемый пост)
Мне подошло данное решение. Кажется, оно оптимально для моего случая

 smile убиться об стену....

skyboy, 30ть раз подумай в следующий раз smile народ шуток не понимает smile
Впрочем, может так ему и надо, раз не понимает? smile


Автор: Wolf1994 11.5.2008, 23:51
Fortop, в рамках данной темы лучшего решения предложено не было. По задаче, которую я им решил я создам отдельную тему - кажется, так следует делать по правилам форума.

Автор: Akina 12.5.2008, 07:57
Цитата(Wolf1994 @  12.5.2008,  00:51 Найти цитируемый пост)
в рамках данной темы лучшего решения предложено не было

И не могло быть предложено. Имхо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)