Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок выбора записей из базы (не ORDER BY) / 15 сообщений из 15, страница 1 из 1
28.09.2004, 11:42
    #32714297
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
Укажите путь!

Есть таблица с записями товаров вида:
create table products(
prodid int(4) unsigned primary key auto_increment,
description char(255),
price float(4,2) unsigned
)
prodid_|_description_|_price
__1______text_1_____3.00
__2______text_2_____3.50
__3______text_3_____4.22
__4______text_4_____1.50
__5______text_5_____2.33

Нужно каким-то образом закрепить порядок выбора некоторых записей, то есть так, чтоб например за prod_id-3 была закреплена 1-я позиция, а за prod_id-1 закреплена 4-я позиция, то есть в результате должна быть такая последовательность: prod_id-3, далее на второй и третьей позиции записи в зависимости от сортировки (но не prod_id-1), prod_id-1, остальные записи так же в зависимости от сортировки...
В таблице порядка 50 тысяч записей.
...
Рейтинг: 0 / 0
28.09.2004, 11:50
    #32714316
Arickkkkk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
А может зависти ещё столбец Position, в котором будет храниться позиция строки и уже его сортировать Order by
...
Рейтинг: 0 / 0
28.09.2004, 11:52
    #32714327
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
позиция не должна быть закреплена за не "фиксированными" записями, потому на них должен влиять order by
...
Рейтинг: 0 / 0
28.09.2004, 12:01
    #32714361
Хрен
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
В соответствии с стандартом sql удинственный путь получить записи в определенном порядке (хоть в каком) это order by

Во всех остальный случаях порядок записей в результате неопределен.
так что ваша постановка задачи некорректна
...
Рейтинг: 0 / 0
28.09.2004, 12:04
    #32714374
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
Кто бы спорил!!!
Но должны же быть какие либо возможности сделать так, чтоб записи были в нужном мне порядке...
...
Рейтинг: 0 / 0
28.09.2004, 12:05
    #32714376
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
p.s. я не отказываюсь от order by
...
Рейтинг: 0 / 0
28.09.2004, 13:40
    #32714645
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
mrMaRkp.s. я не отказываюсь от order by
добавте поле Position [default null] - как вам уже советовали,
у "фиксированных" записей проставляйте необходимое значение ,
у остальных по умолчанию NULL, далее
order by position,prod_id
(правда не помню как идет сортировка при NULL вроде должна NULL - убирать в конец)
...
Рейтинг: 0 / 0
28.09.2004, 13:50
    #32714681
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
null попадает в зависимости от типа (по убыванию/возрастанию) - в первом случае в конце, во втором сначала, но это не то, т.к. записи с null значением не попадут между фиксированными, если между ними имеется "зазор"
...
Рейтинг: 0 / 0
28.09.2004, 14:45
    #32714840
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
mrMaRknull попадает в зависимости от типа (по убыванию/возрастанию) - в первом случае в конце, во втором сначала, но это не то, т.к. записи с null значением не попадут между фиксированными, если между ними имеется "зазор"
Ну извратиться то всегда можно :))
разбейте на два диапазона ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
create table products 
(id int not null primary key auto_increment,
 prodname  varchar( 40 ),
 position int default  200 );

insert into products set  prodname ='prod 1';
insert into products set  prodname ='prod 2';
insert into products set  prodname ='prod 3';
insert into products set  prodname ='prod 4';
insert into products set  prodname ='prod 5';
insert into products set  prodname ='prod 6';
insert into products set  prodname ='prod 7';
insert into products set  prodname ='prod 8';

update products set position =  100  where id< 4 ;
update products set position =  1  where id= 3 ;
update products set position =  101  where id= 1 ;

select * from products order by position,id;

+ ----+--------+----------+ 
| id |prodname| position |
+ ----+--------+----------+ 
|   3  | prod  3  |         1  |
|   2  | prod  2  |       100  |
|   4  | prod  4  |       100  |
|   1  | prod  1  |       101  |
|   5  | prod  5  |       200  |
|   6  | prod  6  |       200  |
|   7  | prod  7  |       200  |
|   8  | prod  8  |       200  |
+ ----+--------+----------+ 
 8  rows in set ( 0 . 00  sec)




...
Рейтинг: 0 / 0
28.09.2004, 14:57
    #32714871
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
не совсем так... нежелательно (точнее нельзя исходя из задачи) закреплять в базе позицию за "плавающими" записями, необходимо, чтобы остальные свободно сортировались по разным полям
...
Рейтинг: 0 / 0
28.09.2004, 15:53
    #32715025
BigHarry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
ORDER BY оперирует конкретными полями в запросе. Если это поле нельзя засунуть в таблицу или каким-то макаром расчитать - то тут уж, извините, ничего не получится - одного желания мало, что бы все выводилось в нужном порядке.
...
Рейтинг: 0 / 0
28.09.2004, 16:52
    #32715184
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
mrMaRkне совсем так... нежелательно (точнее нельзя исходя из задачи) закреплять в базе позицию за "плавающими" записями, необходимо, чтобы остальные свободно сортировались по разным полям
Ну вы батенька извращенец :))
ну попробуйте так что ли, хотя за детерминированность результата не ручаюсь :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select id,prodname, 1  as pos from products where id= 3 
union 
(select id,prodname, 2  as pos from products where id<> 1  and id<> 3  limit  0 , 2 )
union  
select id,prodname, 3  as pos from products where id= 1 
union 
(select id,prodname, 4  as pos from products where id<> 1  and id<> 3  limit  2 , 99999999999 )
order by pos,id;

+ ----+--------+-----+ 
| id |prodname| pos |
+ ----+--------+-----+ 
|   3  | prod  3  |    1  |
|   2  | prod  2  |    2  |
|   4  | prod  4  |    2  |
|   1  | prod  1  |    3  |
|   5  | prod  5  |    4  |
|   6  | prod  6  |    4  |
|   7  | prod  7  |    4  |
|   8  | prod  8  |    4  |
+ ----+--------+-----+ 
 8  rows in set ( 0 . 00  sec)

...
Рейтинг: 0 / 0
28.09.2004, 17:10
    #32715246
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
чуть чуть уточню ...
пусть @FIELD_SORT - поле сортировки не фиксированных записей
@ID_FIRST - ид верхней записи
@ID_OTHER - ид еще одной записи которую нужно зафиксировать
на позиции @N
тогда запрос приобретает вид
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
(select id,prodname,price, 1  as pos from products where id=@ID_FIRST)
union
(select id,prodname,price, 2  as pos from products where id<>@ID_FIRST and id<>@ID_OTHER order by @FIELD_SORT imit @N- 2 )
union
(select id,prodname,price, 3  as pos from products where id=@ID_OTHER)
union
(select id,prodname,price, 4  as pos from products where id<>@ID_FIRST and id<>@ID_OTHER order by @FIELD_SORT limit @N- 2 , 99999999999 )
order by pos;
...
Рейтинг: 0 / 0
28.09.2004, 17:30
    #32715307
mrMaRk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
небольшое уточнение:
записей с фиксированной позицией может быть неопределенное количество, и
зазор между ними как может так и не может быть
...
Рейтинг: 0 / 0
28.09.2004, 17:46
    #32715356
olk
olk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выбора записей из базы (не ORDER BY)
mrMaRkнебольшое уточнение:
записей с фиксированной позицией может быть неопределенное количество, и
зазор между ними как может так и не может быть
Ну я не волшебник
определитесь что вам надо ...
откуда посылаете запрос (на чем клиент ?)
как (чем) определяются фиксированные записи и промежутки между ними (или позиции в текущей выборке)?
перешлите 20 баксов на мой web money кошелек и завтра у вас будет решение ....
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Порядок выбора записей из базы (не ORDER BY) / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]