Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печальный факт, В UNION не работает ORDER BY 
:(
    Опции темы
Kesh
Дата 24.1.2005, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Работает только такой вариант...
Код
(SELECT ... FROM ...)
UNION
(SELECT ... FROM ...)

А вариан типа
Код
(SELECT ... FROM ... ORDER BY)
UNION
(SELECT ... FROM ... ORDER BY)

не работает, если поле сортировки в первом запросе отличается от поля сортировки во втором...
Добавлено @ 16:21
Например запрос
Код
( SELECT c.`id`, c.`d4_startno`, RAND() as `d_rand`
        FROM `cards` c, `people` p
        WHERE (p.`id`=c.`climber`)
          AND (c.`competition`=2)
          AND (p.`gender`='M')
          AND (c.`group`='Senior')
          AND (c.`is_d4`=1)
          AND NOT ISNULL(`d4_startno`)
          AND (c.`trace_no`=1)
        ORDER BY `d4_startno` ASC)
        UNION
        ( SELECT c.`id`, c.`d4_startno`, RAND() as `d_rand`
        FROM `cards` c, `people` p
          WHERE (p.`id`=c.`climber`)
          AND (c.`competition`=2)
          AND (p.`gender`='M')
          AND (c.`group`='Senior')
          AND (c.`is_d4`=1)
          AND ISNULL(`d4_startno`)
          AND (c.`trace_no`=1)
        ORDER BY `d_rand` ASC)

пришлось превратить в такой
Код
( SELECT c.`id`, c.`d4_startno`, RAND() as `d_rand`
        FROM `cards` c, `people` p
        WHERE (p.`id`=c.`climber`)
          AND (c.`competition`=2)
          AND (p.`gender`='M')
          AND (c.`group`='Senior')
          AND (c.`is_d4`=1)
          AND NOT ISNULL(`d4_startno`)
          AND (c.`trace_no`=1))
        UNION
        ( SELECT c.`id`, 65535, RAND() as `d_rand`
        FROM `cards` c, `people` p
          WHERE (p.`id`=c.`climber`)
          AND (c.`competition`=2)
          AND (p.`gender`='M')
          AND (c.`group`='Senior')
          AND (c.`is_d4`=1)
          AND ISNULL(`d4_startno`)
          AND (c.`trace_no`=1))
        ORDER BY `d4_startno` ASC, `d_rand` ASC



--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Mal Hack
Дата 24.1.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Kesh
а если вынести сортировку на UNION?
PM ICQ   Вверх
Akina
Дата 24.1.2005, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Kesh
Похоже на непонимание одного из основных принципов БД.
Вы, похоже, расчитываете, что в рекордсете, полученном при выполнении запроса
Код

(SELECT ... FROM ...)
UNION
(SELECT ... FROM ...)
сперва будут при выборке из рекордсета идти все записи из первой таблицы, и только потом пойдут из второй... и соответственно в рекордсете, полученном при выполнении запроса
Код
(SELECT ... FROM ... ORDER BY ...)
UNION
(SELECT ... FROM ... ORDER BY ...)
они еще и будут сортированы в нужном порядке, так? Так вот - этого не будет. То есть может и будет, но это скорее побочный эффект, и он не абсолютен. Т.е. если в первом запросе нет порядка сортировки, то сервер БД имеет полное право отдать выбранные записи в любом порядке, какой ему взбрендит, в т.ч. перемешать записи или вывалить сперва записи второй таблицы - и тут он в своем праве. Аналогично при заданной сортировке - она выполняется только после получения всего объединения, посему при указанных ЯВНО разных порядках сортировки сервер БД либо должен поступить так же как и с алиасами полей - т.е. проигнорировать все что там во втором и следующих подзапросах, либо заявить что он не может разорваться и сортировать сразу по двум поляим, причем по каждому из них - сначала. Что собсно и происходит. Это нормально.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kesh
Дата 25.1.2005, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



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


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Alternator
Дата 18.3.2009, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



похожая проблема.
точнее даже идентичная.
решил при помощи такого изврата(для вашего случая):
Код

(SELECT * FROM ( SELECT c.`id`, c.`d4_startno`, RAND() as `d_rand` 
         FROM `cards` c, `people` p 
         WHERE (p.`id`=c.`climber`)
           AND (c.`competition`=2)
           AND (p.`gender`='M') 
           AND (c.`group`='Senior') 
           AND (c.`is_d4`=1) 
           AND NOT ISNULL(`d4_startno`) 
           AND (c.`trace_no`=1)
         ORDER BY `d4_startno` ASC) temp_name_1)
UNION 
(SELECT * FROM ( SELECT c.`id`, c.`d4_startno`, RAND() as `d_rand` 
 FROM `cards` c, `people` p 
   WHERE (p.`id`=c.`climber`) 
   AND (c.`competition`=2) 
   AND (p.`gender`='M') 
   AND (c.`group`='Senior') 
   AND (c.`is_d4`=1) 
   AND ISNULL(`d4_startno`) 
   AND (c.`trace_no`=1) 
 ORDER BY `d_rand` ASC)  temp_name_2)

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

Это сообщение отредактировал(а) Alternator - 18.3.2009, 04:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0757 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.