SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.07.2009 13:20:49

SerMax
Участник
Зарегистрирован: 17.07.2009
Сообщений: 3

UNION из одной таблицы с разным order by

Есть такой запрос
(SELECT * from orders WHERE active ='1' order by end_date ASC)
UNION DISTINCT
(SELECT * from orders WHERE active ='2' order by end_date DESC) LIMIT 0,7

Первая сортировка работает отлично, вторая "order by end_date DESC" отказывается работать, сортирует как "order by id ASC". В чём может быть проблема?

Неактивен

 

#2 17.07.2009 15:35:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: UNION из одной таблицы с разным order by

Тот факт, что "первая сортировка работает отлично" - случайное совпадение данных. Сортирвка каждой отдельной выборки без лимита не имеет смысла, так как UNION выдает результырующий неотсортировканный список.
http://dev.mysql.com/doc/refman/5.0/en/union.html

Неактивен

 

#3 18.07.2009 05:23:20

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: UNION из одной таблицы с разным order by

Лучше разделить эти запросы на 2 отдельных и жить счастливо smile

Неактивен

 

#4 19.07.2009 18:36:04

SerMax
Участник
Зарегистрирован: 17.07.2009
Сообщений: 3

Re: UNION из одной таблицы с разным order by

В том то и дело, что нужно сделать это одним запросом, неужели никак?

Неактивен

 

#5 19.07.2009 18:45:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: UNION из одной таблицы с разным order by

Можно, но вот только такое придумалось:
(привожу вместе с созданием таблицы, чтобы можно было убедиться, что работает)

create table ab (a int, b int);
insert into ab values (1,2),(4,2),(2,7),(3,3);
(select @x:=a x,ab.* from ab order by a) union all (select @x:=b+1e9 x,ab.* from ab order by b) order by x;
 


+------------+------+------+
| x          | a    | b    |
+------------+------+------+
|          1 |    1 |    2 |
|          2 |    2 |    7 |
|          3 |    3 |    3 |
|          4 |    4 |    2 |
| 1000000002 |    1 |    2 |
| 1000000002 |    4 |    2 |
| 1000000003 |    3 |    3 |
| 1000000007 |    2 |    7 |
+------------+------+------+
8 rows in set (0.00 sec)

Неактивен

 

#6 20.07.2009 11:35:09

SerMax
Участник
Зарегистрирован: 17.07.2009
Сообщений: 3

Re: UNION из одной таблицы с разным order by

rgbeast
Вся проблема в том, что ордер нужно делать по одной колонке(дата). Первую часть как ASC, вторую как DESC

Неактивен

 

#7 20.07.2009 17:26:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: UNION из одной таблицы с разным order by

UNION выводит результат в соответствии только с последним ордером, поэтому для сортировки используется дополнительное поле - пользовательская переменная @х, которую можно определить как угодно. В приведенном примере она определена через разные столбцы, в вашем случае её нужно будет определить через одну кколонку.

Пдробнее о пользовательских переменных см http://sqlinfo.ru/forum/viewtopic.php?id=363

To rgbeast
Все гениальное просто. Надо будет составить список примеров применения пользовательских переменных. Я вот, например, не сообразил использовать их в данной теме, что уж говорить о новичках, никогда о них не слышавших.
Кроме использования для различных сортировок вспоминается только возможность реализации курсора одним запросом.

Неактивен

 

#8 05.06.2013 14:28:46

Botchal
Участник
Откуда: Санкт-Петербург
Зарегистрирован: 14.10.2011
Сообщений: 11

Re: UNION из одной таблицы с разным order by

Здравствуйте, подскажите, я немного не понял,
почему в

Код:

(select @x:=a x,ab.* from ab order by a)

вы поставили двоеточие и равно? у меня не работает с двоеточием, и почему после @x:=a идёт снова x ? Это представление?
почему в

Код:

(select @x:=b+1e9 x,ab.* from ab order by b)

у вас +1e9 ?? что такое 1e9, это число? Зачем???
У меня похожая задача

Код:

(
    SELECT a.*, b.PROPERTY_105, b.PROPERTY_64, b.PROPERTY_11200, b.PROPERTY_23200, b.PROPERTY_67900, b.PROPERTY_73, b.PROPERTY_106, b.PROPERTY_74, b.PROPERTY_130, a.PREVIEW_PICTURE, IF(b.PROPERTY_11200 > 0 or b.PROPERTY_23200 > 0 or b.PROPERTY_67900 > 0, 1, 2) sklad, b.PROPERTY_248, b.PROPERTY_247,
    @x = a.NAME, sklad x
    FROM `b_iblock_element` a
    LEFT JOIN `b_iblock_element_prop_s14` b ON a.ID = b.IBLOCK_ELEMENT_ID
    WHERE a.IBLOCK_ID = 14 and a.ACTIVE = "Y" AND (   a.NAME = "'.$_SESSION['key_word'].'" or b.PROPERTY_64 like "%'.$_SESSION['key_word'].'%" or a.ID = "'.$_SESSION['key_word'].'"   )
)
    
  UNION DISTINCT
    
(
    SELECT a.*, b.PROPERTY_105, b.PROPERTY_64, b.PROPERTY_11200, b.PROPERTY_23200, b.PROPERTY_67900, b.PROPERTY_73, b.PROPERTY_106, b.PROPERTY_74, b.PROPERTY_130, a.PREVIEW_PICTURE, IF(b.PROPERTY_11200 > 0 or b.PROPERTY_23200 > 0 or b.PROPERTY_67900 > 0, 1, 2) sklad, b.PROPERTY_248, b.PROPERTY_247,
    @x = a.NAME, sklad x
    FROM `b_iblock_element` a
    LEFT JOIN `b_iblock_element_prop_s14` b ON a.ID = b.IBLOCK_ELEMENT_ID
    WHERE a.IBLOCK_ID = 14 and a.ACTIVE = "Y" 
        AND MATCH (a.NAME) AGAINST ("'.$_SESSION['key_word'].'")
)

ORDER BY x

мне нужно назначить @x как sklad и a.NAME.

Вообще я использовал UNION так как надо сначало вывести точные совпадения a.ID товара b.PROPERTY_64 артикул, а потом уже полнотекстовый поиск MATCH AGAINST по названию.
Т.е. если пользователь не указал сортировку, то ему будет выводится вот в таком виде и можно не использовать переменные.
Но если пользователь захочет отсортировать, то данный вывод нужно отсортировать, это вообще реально?


админы украли подпись...

Неактивен

 

#9 05.06.2013 22:36:44

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: UNION из одной таблицы с разным order by

SerMax написал:

Есть такой запрос
(SELECT * from orders WHERE active ='1' order by end_date ASC)
UNION DISTINCT
(SELECT * from orders WHERE active ='2' order by end_date DESC) LIMIT 0,7

Первая сортировка работает отлично, вторая "order by end_date DESC" отказывается работать, сортирует как "order by id ASC". В чём может быть проблема?

SELECT * from (SELECT * from orders WHERE active ='1' order by end_date ASC) a
UNION DISTINCT
SELECT * from (SELECT * from orders WHERE active ='2' order by end_date DESC) b LIMIT 0,7


Оборачиваем в еще один подзапрос.

Отредактированно evgeny (05.06.2013 22:37:21)

Неактивен

 

#10 02.04.2023 09:02:14

deniro21
Участник
Зарегистрирован: 02.04.2023
Сообщений: 1

Re: UNION из одной таблицы с разным order by

rgbeast написал:

Можно, но вот только такое придумалось:

Очень благодарю за это решение. Ни на одном stack не нашел. Требовалось сортировать комментарии текущего пользователя иначе, чем все остальные.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson