Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Оптимизировать сортировку (Антон) 22/09/2012 - 07:26:16
      Re: Оптимизировать сортировку (Akina) 22/09/2012 - 22:45:38
      Re: Оптимизировать сортировку (Антон) 23/09/2012 - 07:01:58
      Re: Оптимизировать сортировку (Akina) 24/09/2012 - 11:13:29

> Original message text:
> From: Антон - 22/09/2012 - 07:26:16
> Subject:Оптимизировать сортировку
> -----------------
> Вобщем вот такой запрос на обновление номера в рейтинге с многосложным условием и сортировкой по 6 полям. Есть ощущение что от многочисленных IF можно исбавиться
> UPDATE
> cb_data114
> SET
> `f1346` =
> (
> select @num
> from (SELECT @num:=1, @type:=0) s
> where
> (@num := if(`f1652` = @type,@num + 1, 1)) is not null
> and (@type := f1652) is not null
> )
> where status=0
> ORDER BY
> `f1656`,
> `f1652`,
> IF (`f1353` = '0000-00-00 00:00:00' and `f1348`='',3,`f1634`),
> IF (`f1353`!= '0000-00-00 00:00:00' and `f1348`!='',f1353,now()),
> IF (`f1353` = '0000-00-00 00:00:00' and `f1348`!='',1,0),
> IF (`f1348` = '', 99999999999999999, CAST(`f1348` as UNSIGNED) )
> Первый IF - если дата и f1348 пустые то опускать в самый низ,т.к. в табле 2-максимальное значение среди искомых.
> Второй - если нет даты и поле f1348 пустое - ставить текущую дату. чтоб опустить в низ рейтинга
> Третий - если дата пустая и f1348 не пустая то опустить в низ
> Четвертый - если f1348 пустое очень большое значение (не достижимое) чтоб опустить вниз
>


From: Akina - 24/09/2012 - 11:13:29
Subject:Оптимизировать сортировку
-----------------
> IF (`f1353` = '0000-00-00 00:00:00' and `f1348`='',3,`f1634`),

> Первый IF - если дата и f1348 пустые то опускать в самый низ,т.к. в табле 2-максимальное значение среди искомых.

Имеется в виду, вероятно, поле f1634, в котором содержится некое значение, причём макс. значение = 2

> IF (`f1353`!= '0000-00-00 00:00:00' and `f1348`!='',f1353,now()),

> Второй - если нет даты и поле f1348 пустое - ставить текущую дату. чтоб опустить в низ рейтинга

Заявленная проверка не совпадает с кодом - оба поле проверяются на то, что они заполнены.

> IF (`f1353` = '0000-00-00 00:00:00' and `f1348`!='',1,0),

> Третий - если дата пустая и f1348 не пустая то опустить в низ

> IF (`f1348` = '', 99999999999999999, CAST(`f1348` as UNSIGNED) )

> Четвертый - если f1348 пустое очень большое значение (не достижимое) чтоб опустить вниз

Тут вроде понятно.

===================

На самом деле несколько всё можно упростить, памятуя о том, что True конвертируется в 0, а False - в 1, т.е.

ORDER BY ... IF (`f1353` = '0000-00-00 00:00:00' and `f1348`!='',1,0), ...

легко преобразуется в

ORDER BY ... (`f1353` = '0000-00-00 00:00:00' and `f1348`!=''1), ...

==================

Если же необходимо упростить (а мне кажется, что упростить можно - особенно при условии, что поля в вычисляемых частях IF на самом деле не нужны) - сформулируйте вербально единое условие сортировки, типа (это только образец!) "... сначала те, где f1353 и f1348 непусты, потом те, где f1348 пусто, а f1353 нет, потом ...."...



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
41683



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |