Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сортировка массива по двум параметрам

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Сортировка массива по двум параметрам
zzakirow
Отправлено: 22 Октября, 2012 - 17:54:36
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Задача состоит в том что бы вывести список товаров. Сортирую товары по алфавиту.
Но, нужно что бы товары с ценой нуль выводились в самом конце списка и тоже по алфавиту. Сделать с помощью двух запросов к базе - легко.
А есть ли методы все это сделать одним запросом?
Список должен выглядеть вот так:

Атовар3 - 15 рублей
Бтовар1 - 25 рублей
Втовар1 - 45 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей

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

У меня из мыслей только разделить массив на два массива (вообще возможно это?)
Подскажите методы, пожалуйста. Если конечно они есть.
 
 Top
KingStar
Отправлено: 22 Октября, 2012 - 18:00:16
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




не получится, только если

Втовар1 - 45 рублей
Бтовар1 - 25 рублей
Атовар3 - 15 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2012 - 18:06:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY field_price=0, field_name, field_price

+- asc/desc, я их регулярно путаю.


-----
PostgreSQL DBA
 
 Top
FIZy
Отправлено: 22 Октября, 2012 - 18:08:30
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2009  


Помог: 0 раз(а)




Делаешь один запрос в базу, выбираешь с сортировкой и начинаешь выводить в цикле. Но если цена равно нулю, не выводить, а записать в новый массив. После цикла вывести этот массив. Так не прокатит?)
 
 Top
DeepVarvar Супермодератор
Отправлено: 22 Октября, 2012 - 18:23:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY field_name ASC, field_price DESC
 
 Top
tuareg
Отправлено: 22 Октября, 2012 - 19:25:48
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




DeepVarvar пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY field_name ASC, field_price DESC

Это плохо. Индексы идут лесом. Наверное, лучший вариант у FIZy
 
 Top
dubasua
Отправлено: 22 Октября, 2012 - 22:33:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




А можно еще вот так
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT bla,bla,bla FROM TABLE WHERE price <> 0 ORDER BY name
  3. UNION
  4. SELECT bla,bla,bla FROM TABLE WHERE price = 0 ORDER BY name
  5.  

Вот вам один запрос.
Сначала вылезут без нуля в отсортированном порядке, а потом добавятся нулевые строки,

(Отредактировано автором: 22 Октября, 2012 - 22:35:28)

 
 Top
zzakirow
Отправлено: 22 Октября, 2012 - 22:53:37
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




[quote=FIZy][/quote]
Да, по ходу то что нужно. Так как у меня используются шаблоны, пожалуй все же сделаю два разных массива и их по очереди отдавать шаблону.
Спасибо.


А такой запрос не подходит:
ORDER BY field_name ASC, field_price DESC

Он сортирует не так как надо.
 
 Top
Panoptik
Отправлено: 22 Октября, 2012 - 23:07:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




правильный запрос должен быть таким. по условию задачи сперва сортируется по цене в ОБРАТНОМ порядке, потом сортируется по имени
CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY field_price DESC, field_name ASC

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


-----
Just do it
 
 Top
dubasua
Отправлено: 22 Октября, 2012 - 23:14:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Panoptik пишет:
правильный запрос должен быть таким. по условию задачи сперва сортируется по цене в ОБРАТНОМ порядке, потом сортируется по имени
CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY field_price DESC, field_name ASC

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


Как я понимаю он сначала будет сортировать по цене не обращая внимания на имя, о когда попадутся одинаковые цены, только тогда он буде сортировать по имени.
 
 Top
zzakirow
Отправлено: 22 Октября, 2012 - 23:25:12
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




[quote=Panoptik][/quote]
В своем примере, наверное, я ввел немного в заблуждение.
Как таковой сортировки по ценам нет. Просто сначала идет вывод товаров у которых цена не равна нулю. И эти товары сортируются по алфавиту.
А уже потом выходят товары у которых цена равна нулю. И их тоже по алфавиту.
Вот свой же пример немного подправлю:

Атовар3 - 55 рублей
Бтовар1 - 25 рублей
Втовар1 - 45 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей
 
 Top
Panoptik
Отправлено: 22 Октября, 2012 - 23:37:54
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну можно извратиться так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT name, price, IF(price = 0,0,1) p FROM yourtable ORDER BY p DESC, name ASC
но тут и вправду нужно будет забыть об индексе. но если таблицы не большие, то подходит очень даже, если большие, то данное виртульное поле "р" нужно наверное ввести в базу. избыточность конечно, но во благо ускорения выборки

(Отредактировано автором: 22 Октября, 2012 - 23:38:14)



-----
Just do it
 
 Top
KingStar
Отправлено: 22 Октября, 2012 - 23:51:37
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




короче, не страдай херней, и выводи нормально, от того что ты ей страдаешь - страдает страничка

Втовар1 - 45 рублей
Бтовар1 - 25 рублей
Атовар3 - 15 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей


-----
То что программа работает, не означает что она написана правильно!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB