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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли так отсортировать? 
V
    Опции темы
maxipub
Дата 6.10.2017, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день!

Код

-- Структура таблицы `table_one`

CREATE TABLE IF NOT EXISTS `table_one` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sub_id` int(10) unsigned NOT NULL,
  `data` varchar(3) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

-- Дамп данных таблицы `table_one`

INSERT INTO `table_one` (`id`, `sub_id`, `data`) VALUES
(1, 10, 'qqq'),
(2, 20, 'www'),
(3, 30, 'eee');

-- Структура таблицы `table_two`

CREATE TABLE IF NOT EXISTS `table_two` (
  `sub_id` int(10) unsigned NOT NULL,
  KEY `sub_id` (`sub_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

-- Дамп данных таблицы `table_two`

INSERT INTO `table_two` (`sub_id`) VALUES
(10),
(30);


Запрос:

Код

SELECT * FROM table_one AS o 
LEFT JOIN table_two AS t ON t.sub_id = o.sub_id 
ORDER BY FIELD(o.data, 'eee', 'www', 'qqq')


Результат:

Код

 id    sub_id    data    sub_id
3    30    eee            30
2    20    www        NULL
1    10    qqq            10


Мне нужно оставить сортировку по полю o.data, но такую чтоб сначала шли значения o.sub_id IS NOT NULL, а потом уже все остальные. Такой результат:

Код

 id    sub_id    data    sub_id
3    30    eee            30
1    10    qqq            10
2    20    www        NULL


Т.е. сортировка по o.data остается, но сначала та часть, где o.sub_id IS NOT NULL, потом та, где o.sub_id IS NULL.

Такое возможно? Пока сделал это костылем через два запроса...
PM MAIL   Вверх
Akina
Дата 7.10.2017, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

Репутация: 101
Всего: 442



Цитата(maxipub @  6.10.2017,  16:31 Найти цитируемый пост)
Мне нужно оставить сортировку по полю o.data, но такую чтоб сначала шли значения o.sub_id IS NOT NULL, а потом уже все остальные.
Дурь какая... o.data в твоих данных уникально, так что после сортировки по нему не будет никаких "сначала" и "потом". Ну и опять же у тебя нет ни одной записи, у которой o.sub_id IS NULL.

Может, надо всё наоборот? тогда тупо 
Код

ORDER BY t.sub_id IS NULL, o.data


Это сообщение отредактировал(а) Akina - 7.10.2017, 22:22


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

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


Опытный
**


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

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



Цитата(Akina @  7.10.2017,  22:20 Найти цитируемый пост)
нет ни одной записи, у которой o.sub_id IS NULL

Как нет? Их дает LEFT JOIN.

Цитата(Akina @  7.10.2017,  22:20 Найти цитируемый пост)
Может, надо всё наоборот? тогда тупо

Может быть. Вроде оно. Как будет возможность, проверю, отпишусь.
PM MAIL   Вверх
Akina
Дата 12.10.2017, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

Репутация: 101
Всего: 442



Цитата(maxipub @  12.10.2017,  15:06 Найти цитируемый пост)
Как нет? Их дает LEFT JOIN.

НЕТ!!! 
t.sub_id IS NULL - есть.
o.sub_id IS NULL - нет.


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

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


Опытный
**


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

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



Akina, да, все верно. Думал об одном, написал другое. smile 
PM MAIL   Вверх
maxipub
Дата 12.10.2017, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akina, в очередной раз благодарю! Вопрос решен. Не задумывался ранее о применении IS NULL в ORDER BY, классное решение. Сколько же всего еще не знаешь... smile
PM MAIL   Вверх
Akina
Дата 12.10.2017, 16:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

Репутация: 101
Всего: 442



Цитата(maxipub @  12.10.2017,  17:26 Найти цитируемый пост)
Не задумывался ранее о применении IS NULL в ORDER BY

Стандартный подход, когда надо разделить набор на несколько групп, в каждой из которых отдельная (а то и вовсе своя) сортировка - введение в начало набора выражений сортировки логического выражения, делящего на группы. 

Вот например: отсортировать числа, сперва неотрицательные по возрастанию, потом отрицательные по убыванию.

Код

ORDER BY field < 0  /* сперва делим на группы, 
                       первыми пойдут false, 
                       т.е. неотрицательные, 
                       только потом положительные */
       , ABS(field) /* а потом уже сортировка внутри групп */



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

PM MAIL WWW ICQ Jabber   Вверх
Google
  Дата 17.10.2017, 14:32 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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