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 :: Сортировка массива по двум параметрам
Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012
Помог: 0 раз(а)
Задача состоит в том что бы вывести список товаров. Сортирую товары по алфавиту.
Но, нужно что бы товары с ценой нуль выводились в самом конце списка и тоже по алфавиту. Сделать с помощью двух запросов к базе - легко.
А есть ли методы все это сделать одним запросом?
Список должен выглядеть вот так:
Атовар3 - 15 рублей
Бтовар1 - 25 рублей
Втовар1 - 45 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей
Т.е. не смотря, на то что по алфавиту последних два товара должны быть выше, они в самом низу так как цена у них нуль.
У меня из мыслей только разделить массив на два массива (вообще возможно это?)
Подскажите методы, пожалуйста. Если конечно они есть.
KingStar
Отправлено: 22 Октября, 2012 - 18:00:16
Участник
Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011 Откуда: Беларусь
Помог: 69 раз(а)
не получится, только если
Втовар1 - 45 рублей
Бтовар1 - 25 рублей
Атовар3 - 15 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей
----- То что программа работает, не означает что она написана правильно!
Мелкий
Отправлено: 22 Октября, 2012 - 18:06:50
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2009
Помог: 0 раз(а)
Делаешь один запрос в базу, выбираешь с сортировкой и начинаешь выводить в цикле. Но если цена равно нулю, не выводить, а записать в новый массив. После цикла вывести этот массив. Так не прокатит?)
DeepVarvar
Отправлено: 22 Октября, 2012 - 18:23:43
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012
Помог: 0 раз(а)
[quote=FIZy][/quote]
Да, по ходу то что нужно. Так как у меня используются шаблоны, пожалуй все же сделаю два разных массива и их по очереди отдавать шаблону.
Спасибо.
А такой запрос не подходит:
ORDER BY field_name ASC, field_price DESC
Он сортирует не так как надо.
Panoptik
Отправлено: 22 Октября, 2012 - 23:07:19
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
правильный запрос должен быть таким. по условию задачи сперва сортируется по цене в ОБРАТНОМ порядке, потом сортируется по имени
не думаю что это повредит индексам если они правильно расставлены, или будут возражения?
Как я понимаю он сначала будет сортировать по цене не обращая внимания на имя, о когда попадутся одинаковые цены, только тогда он буде сортировать по имени.
zzakirow
Отправлено: 22 Октября, 2012 - 23:25:12
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2012
Помог: 0 раз(а)
[quote=Panoptik][/quote]
В своем примере, наверное, я ввел немного в заблуждение.
Как таковой сортировки по ценам нет. Просто сначала идет вывод товаров у которых цена не равна нулю. И эти товары сортируются по алфавиту.
А уже потом выходят товары у которых цена равна нулю. И их тоже по алфавиту.
Вот свой же пример немного подправлю:
Атовар3 - 55 рублей
Бтовар1 - 25 рублей
Втовар1 - 45 рублей
Атовар2 - 0 рублей
Бтовар2 - 0 рублей
Panoptik
Отправлено: 22 Октября, 2012 - 23:37:54
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
SELECT name, price,IF(price = 0,0,1) p FROM yourtable ORDERBY p DESC, name ASC
но тут и вправду нужно будет забыть об индексе. но если таблицы не большие, то подходит очень даже, если большие, то данное виртульное поле "р" нужно наверное ввести в базу. избыточность конечно, но во благо ускорения выборки
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.