Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > union 2 таблиц с разной сортировкой


Автор: bankir 14.1.2010, 16:15
Товарищи выручайте!
Есть задача:
нужно вывести каталог товаров из таблицы (name, price, price_spec) subcatalog и exist - не упоминаю в примере для простоты
price - обычная цена, price_spec - цена со скидкой, если цены со скидкой нет, то она равна 0
машинка | 500 | 0
трактор  | 300 | 100

в итоге на сайте выводит позицию "машинка" по цене 500, а "трактор" по (цена 300 зачеркнуто, а сверху красным 100)

Так вот, хотелось бы вывести все скидочные позиции в начале каталога отсортированными по цене, а потом обычные тоже отсортированные по цене. 
В теории понимаю, что необходимо сначала выбрать все скидочные и отсортировать, а потом объединить снизу обычные отсортированные.
Код

(
select * from items 
where (exist>0) and subcatalog='12' and (price_spec>0) ORDER BY price_spec asc
) 
UNION (
select * from items 
where (exist>0) and subcatalog='12' and (price_spec=0) ORDER BY price asc
) LIMIT 0, 8


Данный код сортирует только скидочные правильно, а обычные не сортирует.
name      | price | price_spec
Набор 1 | 2000 | 450 
Набор 2 | 1700 | 460 
Набор 3 | 250   | 0 
Набор 4 | 400   | 0 
Набор 5 | 400   | 0 
Набор 6 | 200   | 0 

У кого какие соображения по этому поводу? 
Не хотелось бы идти через временную таблицу, так как набор полей часто меняется в таблице (некоторые добавляются, потом могут поменяться местами и тд), а в коде надо жестко задавать тип и название полей таблицы (реально порядка 20 полей в таблице, здесь привел сокр вариант).
К тому же идет постраничный вывод на экран для чего и используется LIMIT n, m

Подскажите в каком направлении рыть. Может нельзя одновременно использовать сортировку и в 1 и во втором 2 select?

Автор: bankir 14.1.2010, 18:04
все, решилось
Код

select * from
(
select * from items 
where (exist>0) and subcatalog='12' and (price_spec>0) ORDER BY price_spec asc
) as tbl1
UNION ALL
select *
from
(
select * from items 
where (exist>0) and subcatalog='12' and (price_spec=0) ORDER BY price asc
) as tbl2
LIMIT 0, 8

может кому пригодится

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