Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: двойная сортировка в SQL-запросе

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
TroL
Отправлено: 14 Ноября, 2014 - 10:47:15
Post Id


Гость


Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




Не могу создать правильный запрос к таблице с двумя сортировками дат

Есть таблица, надо что бы сортировалась от большей даты к меньшей, независимо от колонки.
-------------------------------- ----
| id | date1 | date2 |
-------------------------------- ----
| 1 | 2014-10-20| 2014-10-25|
| 2 | 2014-10-21| 2014-11-20|
| 3 | 2014-10-15| 0000-00-00|
| 4 | 2014-10-10| 2014-10-20|
| 5 | 2014-11-22| 0000-00-00|
| 6 | 2014-10-13| 2014-11-25|

Что надо получить:
------------------------------------
| id | date1 | date2 |
-------------------------------- ----
| 6 | 2014-10-13| 2014-11-25|
| 5 | 2014-11-22| 0000-00-00|
| 2 | 2014-10-21| 2014-11-20|
| 1 | 2014-10-20| 2014-10-25|
| 4 | 2014-10-10| 2014-10-20|
| 3 | 2014-10-15| 0000-00-00|




Со стандартной сортировкой отлично знаком и ORDER BY date1 DESC, date2 DESC даст таблицу. Что совсем не то что надо
------------------------------------
| id | date1 | date2 |
-------------------------------- ----
| 5 | 2014-11-22| 0000-00-00|
| 2 | 2014-10-21| 2014-11-20|
| 1 | 2014-10-20| 2014-10-25|
| 3 | 2014-10-15| 0000-00-00|
| 6 | 2014-10-13| 2014-11-25|
| 4 | 2014-10-10| 2014-10-20|


Буду благодарен Вашей помощи знатоки
 
 Top
Мелкий Супермодератор
Отправлено: 14 Ноября, 2014 - 11:34:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Я не понял, по какому признаку получился образец желаемой сортировки, так что играйтесь откуда-то отсюда:
CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY IF(date1>date2, date1, date2)


-----
PostgreSQL DBA
 
 Top
TroL
Отправлено: 14 Ноября, 2014 - 11:36:39
Post Id


Гость


Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




Все, задача решена. Оказалось все проще))
Решение:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2. IF(date1  < date2`, date2, date1) AS date_sort, *
  3. FROM `my_table`
  4. ORDER BY date_sort DESC


Принцип:
IF(date1 < date2`, date2, date1) AS date_sort -тут мы выбираем большую дату и присваиваем к переменной date_sort, а потом по ней и отсортировываем
(Добавление)
Мелкий пишет:
Я не понял, по какому признаку получился образец желаемой сортировки, так что играйтесь откуда-то отсюда:
CODE (SQL):
скопировать код в буфер обмена
  1. ORDER BY IF(date1>date2, date1, date2)

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

(Отредактировано автором: 14 Ноября, 2014 - 11:37:01)

 
 Top
LIME
Отправлено: 14 Ноября, 2014 - 20:46:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




TroL пишет:
Выбрал свой вариант по другим соображениям
соображения понятны
нужна дата сортировки
это ясно
не об этом
если таблица не маленькая или хочет в будущем расти тут явно лучше добавить дополнительное индексное поле(иначе каждая выборка это полный перебор всей таблицы в экспоненте)
в котором будет хранится бОльшая из дат
и тогда сортировка по одному проиндексированному полю
быстро и не сердито
(Добавление)
ну а раз пошла такая пьянка то из бОльшей даты формируешь целое число путем удаления разделителей и индексируешь по целочисленному полю
таблица будет летать))
 
 Top
TroL
Отправлено: 14 Ноября, 2014 - 22:13:11
Post Id


Гость


Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




LIME пишет:
ну а раз пошла такая пьянка то из бОльшей даты формируешь целое число путем удаления разделителей и индексируешь по целочисленному полю
таблица будет летать))

Ну да таблица большая, 37000 пока, а колонок так вообще более 50и. Но одна из дат регулярно меняется, а другая дата создания записи. Тоже думал создать третью дату которая за все это и будет отвечать. Но структура и организация ЦРМки "кустарная" поэтому при добавлении третьей даты я замучаюсь всю систему подгонять под нее
 
 Top
LIME
Отправлено: 14 Ноября, 2014 - 22:15:42
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




да ну фигня
индексное поле добавляется одним запросом
а чтоб впредь добавлялось можно тригер прикрутить
типа при сохранении новой записи проставится и это поле
имхо лучшее решение
и прошу не забыть что поле лучше бы было целочисленое
(Добавление)
дельную весчь толкаю тебе
погугли что есть тригер и как его использовать
по идее решит все твои печали в лучшем виде
(Добавление)
TroL пишет:
Но одна из дат регулярно меняется
тригер на апдейт
(Добавление)
слегка помучаешься узнавая новое...решишь впредь и навсегда проблемы с индексацией и скоростью выборки
день головной боли изучения и тестов VS нет проблем в будущем
что перевешивает?)))
 
 Top
TroL
Отправлено: 15 Ноября, 2014 - 05:43:14
Post Id


Гость


Покинул форум
Сообщений всего: 73
Дата рег-ции: Нояб. 2012  


Помог: 0 раз(а)




LIME пишет:
да ну фигня
индексное поле добавляется одним запросом
а чтоб впредь добавлялось можно тригер прикрутить
типа при сохранении новой записи проставится и это поле
имхо лучшее решение
и прошу не забыть что поле лучше бы было целочисленое
(Добавление)
дельную весчь толкаю тебе
погугли что есть тригер и как его использовать
по идее решит все твои печали в лучшем виде
(Добавление)
TroL пишет:
Но одна из дат регулярно меняется
тригер на апдейт
(Добавление)
слегка помучаешься узнавая новое...решишь впредь и навсегда проблемы с индексацией и скоростью выборки
день головной боли изучения и тестов VS нет проблем в будущем
что перевешивает?)))


Блин, точно. Тригеры всему решения. Большое спасибо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB