ORDER только для всего UNIONa, или для каждого отдельного запроса тоже?

fog

Рыцарь Джедай
ORDER только для всего UNIONa, или для каждого отдельного запроса тоже?

Не могу понять, ORDER внутри каждого из запросов в UNION игнорируется?

Код:
(
	SELECT transport_id 
	FROM trucking_transport 
	where transport_id >= 14 
	ORDER BY transport_id DESC
)
UNION
(
	SELECT transport_id 
	FROM trucking_transport 
	where transport_id <= 12 
	ORDER BY transport_id ASC
);
В этом запросе для примера ORDER'ы никак не влияют на порядок отображения записей.

результат такой

14
16
17
18
19
20
21
22
23
10
11
12

а должен быть такой

23
22
21
20
18
17
16
14
10
11
12
 

fog

Рыцарь Джедай
Насколько я понял, здесь что-то об этом говорится, но я не могу понять что именно =)

To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows. If ORDER BY appears with LIMIT, it is used to determine the subset of the selected rows to retrieve for the SELECT, but does not necessarily affect the order of those rows in the final UNION result. If ORDER BY appears without LIMIT in a SELECT, it is optimized away because it will have no effect anyway.
-~{}~ 04.04.06 15:08:

оп, .des. опередил. Да, эта страница у меня сейчас как раз открыта, только я не могу понять объяснений.
 

.des.

Поставил пиво кому надо ;-)
читайте два последних абзаца.
 

fog

Рыцарь Джедай
.des.
Всё равно не могу понять, как правильно сортировать...
 

.des.

Поставил пиво кому надо ;-)
Код:
(
	SELECT transport_id 
	FROM trucking_transport 
	where transport_id >= 14 
)
UNION
(
	SELECT transport_id 
	FROM trucking_transport 
	where transport_id <= 12 
)
ORDER BY transport_id DESC
Но, запрос очень странный
почему бы его просто не переписать без UNION?
Код:
SELECT transport_id 
FROM trucking_transport 
WHERE (transport_id <=12 OR transport_id>= 14)
ORDER BY transport_id DESC
И вообще сама мысль сортировать по transport_id довольно странная :)
 

fog

Рыцарь Джедай
=)

.des., Вы немного не так поняли мой вопрос...

на самом деле реальный запрос больше и сложнее, там мне нужен UNION, хотя в соседнем топике уже предложили вариант без него....

Пример который Вы привели отсортирует ВСЕ выбранные записи, а мне нужно отсортировать по ходу добавления даписи у которых совпало первое условие, а затем те, у которых совпало второе условие.

Например, результат должен быть таким (это идентификаторы записей):

24
17
7
3
102
88
14

24-3 это первый запрос UNIONа, 102-14 - второй запрос
каждый запрос отсортирован независимо от другого.

Видимо, я не очень удачный пример выбрал для первого поста...
 

.des.

Поставил пиво кому надо ;-)
хм.. тогда действительно ORDER BY .. CASE причем ORDER BY CASE можно использовать с UNION тоже.
Вообще UNION в MySQL часто используют чтобы добиться использования индексов когда в условии присутствует логика OR, но судя по соседнему топику использование индексов вам не грозит. Обязательно нужно искать path при помощи substring? возможно стоит пересмотреть структуру?
 

fog

Рыцарь Джедай
в доке есть пример

Код:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
"ORDER BY a" по идее должно сортировать... но у меня не сортируется...
 
Сверху