EnChikiben
@EnChikiben

Union & ORDER BY?

Доброе время суток!


Есть таблица:

idnamegood_namepayment
1aaatrue
2bbbpayment
3ccctrue



Необходимо выбрать оплаченные компании и отсортировать их по товару (good_name) затем идут неоплаченные, а их надо отсортировать по названию компании (name).


Пробовал через union:

(SELECT * FROM `table` WHERE `payment`=&quot;true&quot; ORDER BY `good_name` ASC )<br/>
union<br/>
(SELECT * FROM `table` WHERE `payment`=&quot;false&quot; ORDER BY `name` ASC )<br/>



Как можно реализовать сия извращение?..


П.С. Спасибо поправил ошибки.
  • Вопрос задан
  • 9609 просмотров
Пригласить эксперта
Ответы на вопрос 5
Agent_J
@Agent_J
а можно проще

SELECT 
    *,
    IF(`payment`='true', `good_name`, `name`) prior
FROM `table` 
WHERE 
    `payment`="true" 
ORDER BY payment, prior
Ответ написан
Agent_J
@Agent_J
SELECT * FROM (
   SELECT * FROM `table` WHERE `payment`=="true" ORDER BY `good_name` ASC
) a
UNION
select * from (
   SELECT * FROM `table` WHERE `payment`=="false" ORDER BY `name` ASC 
) b

так будет работать, но вы правы — это извращение
Ответ написан
@cuprum
SELECT * FROM `table` ORDER BY `payment` DESC, `good_name` ASC
Ответ написан
XaBoK
@XaBoK
За синтаксис не ручаюсь, но смысл простой — делайте Select из обобщённой таблицы с помощью дополнительного поля:
SELECT   id, name, good_name, payment
FROM     (SELECT   TOP (100) PERCENT id, name, good_name, payment, good_name AS ordr
            FROM     temp
            WHERE   (payment = 1)
            UNION
            SELECT   TOP (100) PERCENT id, name, good_name, payment, name AS ordr
            FROM     temp AS temp_1
            WHERE   (payment = 0)) AS t2_1
ORDER BY payment DESC, ordr


* This source code was highlighted with Source Code Highlighter.
Ответ написан
GeniyZ
@GeniyZ
а в какой это СУБД можно/нужно писать WHERE `payment`==«true» вместо IS TRUE да ещё и с задвоенным равно? Прошу не пинать — кроме ORACLE практически ни чего не видел за последние пару лет и максимально стараюсь ANSI использовать.

мой вариант: SELECT t.*, decode(payment, true, good_name, name) as ord FROM table as t ORDER BY ord
ни чем не лучше варианта с IF/CASE
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы