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

Подскажите пожалуйста, как решить такую задачу:

Есть массив пользователей, отсортированный в определённом порядке.
И есть представление, из которого можно получить информацию о пользователе.

Вызываю так:
SELECT * FROM dbo.View_Users WHERE id IN (3, 1, 5, 2)

но получаю значения в произвольном порядке ((
Как мне получить из представления тот же упорядоченный список 3, 1, 5, 2 с данными?



Спустя 5 минут, 58 секунд (8.12.2010 - 15:38) sharki написал(а):
Попробуй выставить в запросе еще ORDER BY `по какой столбцу сортировать`

Спустя 8 минут, 41 секунда (8.12.2010 - 15:46) zvezda_t написал(а):
так сортировать нужно не просто по возрастанию или убыванию - а в том порядке как входной массив задан (3, 1, 5, 2) - как это осуществить?

Спустя 4 минуты, 19 секунд (8.12.2010 - 15:51) vital написал(а):
Цитата
но получаю значения в произвольном порядке ((

Каждый раз в новом при одном запросе?

Спустя 1 минута, 58 секунд (8.12.2010 - 15:53) zvezda_t написал(а):
Цитата
Каждый раз в новом при одном запросе?

нет, если один и тот же массив - то порядок один и тот же, но не тот что мне нужен. Мне то нужно мой порядок сохранить.

Спустя 3 минуты, 28 секунд (8.12.2010 - 15:56) vital написал(а):
Это хорошо. Теперь стоит рассказать какой порядок подробно)

Спустя 2 минуты, 12 секунд (8.12.2010 - 15:58) zvezda_t написал(а):
из представления он вынимает мои номера, но хаотично - я не вижу там логики - просто в перемешку...

Спустя 7 минут, 8 секунд (8.12.2010 - 16:05) Invis1ble написал(а):
zvezda_t
Меня тоже заинтересовал вопрос, думаю что придется отдельно 4 запроса выполнять... unsure.gif

Спустя 41 минута, 22 секунды (8.12.2010 - 16:47) SlavaFr написал(а):
гдето так

$a=array(3, 1, 5, 2);
$rezultat=array();
$res=...query( 'SELECT * FROM dbo.View_Users WHERE id IN('.implode(",",$a).')');
....
while($stroka=mssql_fetch_assoc($res)){
$rezultat[array_searsh($res['id'],$a)]=$stroka;
}

print_r( $rezultat);

Спустя 20 минут, 23 секунды (8.12.2010 - 17:07) vital написал(а):
Mysql вернет вам строки в порядке их поялвения в таблице. Поэтому, если надо сохранить порядок в согласно изначальному массиву - выборку надо отсортировать еще раз.. Бред какой, но наверно так.
ВАриант выше вон..

Спустя 1 минута, 9 секунд (8.12.2010 - 17:08) linker написал(а):
А в чем смысл такого строго порядка?

Спустя 11 секунд (8.12.2010 - 17:08) vital написал(а):
Хм, лень пробовать, но может прокатит что-то в духе ORDER BY _тутчереззапятуютожечтобыловin_

Спустя 1 минута, 51 секунда (8.12.2010 - 17:10) linker написал(а):
vital
Читаем мануал по SQL, прежде чем давать такие советы.

Спустя 1 час, 42 минуты, 58 секунд (8.12.2010 - 18:53) sergeiss написал(а):
Есть идея... Только я не знаю, можно ли её реализовать именно в MySQL.

Если ключевого поля нету... То надо его создать! Для этого надо сделать функцию (это в MySQL возможно), с определенным функционалом (который как раз и надо определить, возможен ли).

На момент запуска запроса известно, какие будут параметры. Поэтому список параметров передаем в функцию. Назовём её get_id_order

SELECT *, get_id_order( 3, 1, 5, 2) as new_order FROM dbo.View_Users WHERE id IN (3, 1, 5, 2)

И эта функция должна будет вернуть 1 для первого параметра (в примере для 3), 2 для второго (для 1), 3 для третьего (для 5) и т.д.
И потом надо только будет отсортировать по этому полю.

Если другой набор параметров, то ПХП поможет сформировать нужный запрос.

И вот тут появляется вопрос к большим знатокам MySQL - можно ли это реализовать? В Postgre - возможно. С некоторыми танцами с бубном, но реализуемо.

Спустя 1 час, 41 минута, 28 секунд (8.12.2010 - 20:35) linker написал(а):
В MySQL обычно делают отдельное поле, в котором указывают порядковый номер сортировки.

Спустя 36 минут, 13 секунд (8.12.2010 - 21:11) inpost написал(а):
Разве что сделать выборку, результат поместить в массив:
$bbb = mysql_query();
while($aaa = mysql_fetch_array($bbb))
$array[] = $aaa;
далее вывод в нужном порядке.

Или выбрать в объект, кажется куда проще будет.

Спустя 1 час, 3 минуты, 43 секунды (8.12.2010 - 22:15) SlavaFr написал(а):
у нее не MySql a MSSql, на сколько я помню. Да в принципе тот код что я послал должен работать.
В mysql это делается просто order by find_in_set(id,'3,1,5,2')

Спустя 20 минут, 33 секунды (8.12.2010 - 22:35) inpost написал(а):
SlavaFr
А разница? Если на прямую никак, то в массив и сортировка

Спустя 2 минуты, 31 секунда (8.12.2010 - 22:38) Invis1ble написал(а):
Во-во, зачем все эти танцы с бубном?

Спустя 2 часа, 24 минуты, 46 секунд (9.12.2010 - 01:02) SlavaFr написал(а):
Цитата (inpost @ 8.12.2010 - 19:35)
SlavaFr
А разница? Если на прямую никак, то в массив и сортировка

@inpost я не совсем понимаю вопроса o разнице.
Я показал обслютно реальный вариант как при чтени сразу внести в масив соблюдая сортировку.
Я показал как в мysql делать заранее зная что у неё Mssql, просто, для других...

А что собственно придумывать как потом масив сортировать если уже готовый вариант есть.

Спустя 7 часов, 4 минуты, 31 секунда (9.12.2010 - 08:07) zvezda_t написал(а):
sergeiss
это то, что ты имел в виду?

SELECT T.* FROM 
dbo.View_Users T
INNER JOIN
(
select 3 id, 0 OrdNum
union all
select
1 id, 1 OrdNum
union all
select
5 id, 2 OrdNum
union all
select
2 id, 3 OrdNum
) X
ON
T.id=X.id
ORDER BY X.OrdNum


а если у меня 1000 элементов в массиве, не будет тормозить такой запрос (или функция)?


SlavaFr
$a=array(3, 1, 5, 2);
$rezultat=array();
$res=...query( 'SELECT * FROM dbo.View_Users WHERE id IN('.implode(",",$a).')');
....

while($stroka=mssql_fetch_assoc($res)){
$rezultat[array_searсh($res['id'],$a)]=$stroka;
}

print_r( $rezultat);


спасибо, за пример!!!!
пытаюсь разобраться, у меня почему то значения только для первого id=3, выходят...
print $rezultat[0]['id']; //=3
print $rezultat[1]['id']; // не определён


заменила
$rezultat[array_searсh($res['id'],$a)]=$stroka;
на
$rezultat[array_searсh($stroka['id'],$a)]=$stroka;

теперь получила двумерный массив
print $rezultat[0]['id']; //=3
print $rezultat[1]['id']; // =1
print $rezultat[2]['id']; // =5
print $rezultat[3]['id']; // =2

правильно?

В итоге вывожу значения так:

$a=array(3, 1, 5, 2);
$rezultat=array();
$res=...query( 'SELECT * FROM dbo.View_Users WHERE id IN('.implode(",",$a).')');
....

while($stroka=mssql_fetch_assoc($res))
{
$rezultat[array_search($stroka['id'],$a)]=$stroka;
}

//задаём массиву правильный порядок
ksort($rezultat);

foreach($rezultat as $key=>$stroka_sort)
{
$id=$stroka_sort['id'];
$name_user=$stroka_sort['name'];
print $id." ".$name_user;
}


Спустя 3 часа, 35 минут, 52 секунды (9.12.2010 - 11:43) SlavaFr написал(а):
извеняюсь зделал ошибку, так как пример на лету писал.
конечно правильно $stroka['id']
$rezultat[array_searсh($stroka['id'],$a)]=$stroka;
молoдeц что сама догодалась!

Спустя 19 минут, 51 секунда (9.12.2010 - 12:03) sergeiss написал(а):
Цитата (zvezda_t @ 9.12.2010 - 09:07)
sergeiss
это то, что ты имел в виду?

Нет, я имел ввиду другое. Функцию в MSSQL, подобную той, что была показана для MySQL. Или найти такую же, или сделать самостоятельно.


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

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