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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> группировка, сортировка и вывод дерева, упорядоченное дерево категорий 
V
    Опции темы
slutsker
Дата 6.12.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



добрый день,
есть MySQL табличка категорий вида (у категории может быть категория родитель)

id | name | parent_id

пусть она имеет вид

 1 Статьи  0
 2 Спорт   1
 3 Авто     1
................
90 Налоги 1
91 Повести 0
92 Русские 91
93 Европейские 91
.........
120 Ремонт 1

как бы мне вывести записи из базы так, чтобы они были сгруппировали по parent_id и отсортированы по алфавиту
и стало так

Статьи
__Авто
__Налоги
__Ремонт
__Спорт
Повести
__Европейски
__Русские



--------------------
Compiling...project.cppLinking...Embedding manifest...========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
PM MAIL   Вверх
Akina
Дата 6.12.2012, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(slutsker @  6.12.2012,  01:30 Найти цитируемый пост)
у категории может быть категория родитель

Максимальный уровень вложенности - фиксирован?


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

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


Бывалый
*


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

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



максимальный уровень вложенности, в настоящий момент, фиксирован - у дочернего элемента не может быть дочернего элемента

это важное дополнение позволило решить задачу запросом вида
Код

SELECT id, name, parent_id FROM `cats` ORDER BY IF(parent_id>0, parent_id, id-0.5), name

(решение подсказал очень грамотный специалист, за это ему большое спасибо)

если вам известно, как это можно сделать для произвольного уровня вложенности средствами MySQL, пожалуйста, напишите

--------------------
Compiling...project.cppLinking...Embedding manifest...========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
PM MAIL   Вверх
Akina
Дата 6.12.2012, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(slutsker @  6.12.2012,  11:28 Найти цитируемый пост)
как это можно сделать для произвольного уровня вложенности 

Просто изменить структуру хранения на ту, которая  предназначена для хранения и обработки деревьев. Скажем, Nested Set.

Добавлено через 5 минут и 41 секунду
Цитата(slutsker @  6.12.2012,  11:28 Найти цитируемый пост)
это важное дополнение позволило решить задачу запросом вида

Если в данных будут изменения, и у какой-то категории потомок будет иметь ID меньше, чем родитель (почему нет?) - запрос вывалит чушь.
Правильный вариант:
Код

SELECT
  id
, name
, parent_id 
FROM
  cats
ORDER BY 
  CASE WHEN parent_id=0 THEN id ELSE parent_id END
, parent_id=0 /* или parent_id!=0 ? лень думать... попробуй */
, name;



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

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


Бывалый
*


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

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



странно,
проверил приведенный мною запрос на случай, когда id родителя меньше id сына - он работает

ваш запрос работает, но выдаёт в неправильном виде

__Авто
__Налоги
__Ремонт
__Спорт
Статьи
__Европейски
__Русские
Повести
--------------------
Compiling...project.cppLinking...Embedding manifest...========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
PM MAIL   Вверх
Akina
Дата 6.12.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(slutsker @  6.12.2012,  14:27 Найти цитируемый пост)
проверил приведенный мною запрос на случай, когда id родителя меньше id сына - он работает

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

Цитата(slutsker @  6.12.2012,  14:27 Найти цитируемый пост)
ваш запрос работает, но выдаёт в неправильном виде

Коммент прочитать и поправить лениво было? ну и не надо...



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

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


Бывалый
*


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

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



вот с parent_id!=0 работает правильно (не понял ваш комментарий в первый раз)

спасибо за рекомендацию Nested Set
--------------------
Compiling...project.cppLinking...Embedding manifest...========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
PM MAIL   Вверх
Akina
Дата 6.12.2012, 23:25 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(slutsker @  6.12.2012,  22:55 Найти цитируемый пост)
вот с parent_id!=0 работает правильно 

Просто всегда забываю, в каких ЯП и СУБД True интерпретируется как 1, а в каких как -1...


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

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


 




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


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

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