SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.01.2014 16:39:43

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Сортировка по нескольким условиям

При написании форума возникла проблема при выводе главной страницы.

Хочу сделать так, чтобы сформировать главную страницу одним запросом - без join.

Вот таблица для примера. Записи 3, 6, 9 это категории форума.


id   position   parent_id
1------3-------9       
2------5-------3
3------2-------0         
4------1-------6
5------2-------9
6------1-------0
7------4-------3
8------1-------9
9------3-------0

В итоге нужно отсортировать записи по позиции категорий, а потом по порядку в каждой категории. Чтобы было понятно приведу результирующую таблицу: (нули в табличке  - потому что незнаю, что записать в это поле)
id   position   parent_id
6------1-------0       
4------1-------6
3------2-------0         
7------4-------3
2------5-------3
9------3-------0
8------1-------9
5------2-------9
1------2-------9

Можно ли решить эту задачу одним запросом либо может нужно как-то изменить структуру таблицы?
Заранее спасибо.

Отредактированно new_saler (08.01.2014 16:41:59)

Неактивен

 

#2 08.01.2014 16:46:56

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сортировка по нескольким условиям

new_saler написал:

В итоге нужно отсортировать записи по позиции категорий, а потом по порядку в каждой категории.

Расшифруйте эту фразу, непонятно, чего Вы хотите.
Вообще сортировку по двум параметрам можно сделать так:
select * from t order by field1, field2


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

Неактивен

 

#3 08.01.2014 17:06:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по нескольким условиям

ХШ подсказывает, что корневые категории (те у которых parent=0) выводятся в порядке position, но после каждой корневой идут её потомки тоже в порядке position.


Почему не хотите join? Может быть и можно это сделать без join одним запросом (путем жестких извращений через подзапросы и пользовательские переменные), но будет явно менее производительно.

Неактивен

 

#4 08.01.2014 17:35:31

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Re: Сортировка по нескольким условиям

vasya, да, вы всё правильно написали.
А как можно с join? Разбить данные на 2 таблицы?

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

Неактивен

 

#5 08.01.2014 17:39:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по нескольким условиям

Неактивен

 

#6 09.01.2014 13:17:59

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Re: Сортировка по нескольким условиям

vasya написал:

Посмотрите статью Как сделать иерархическое меню?

Прочитал.
Сложноватая логика php получается...

Если честно, рассчитывал, что эту задачу можно выполнить проще.
Всё еще хочется найти легкое и изящное решение.

Вроде как должно получиться, если разбить форумы и категории на 2 таблицы и сделать запрос с джоином.

Отредактированно new_saler (09.01.2014 13:27:57)

Неактивен

 

#7 09.01.2014 13:34:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по нескольким условиям

new_saler написал:

Вроде как должно получиться, если разбить форумы и категории на 2 таблицы и сделать запрос с джоином.

Да

Неактивен

 

#8 09.01.2014 13:38:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Сортировка по нескольким условиям

Сортировка будет ORDER BY position_f, position_k
где position_f поле из таблицы форумов; position_k - из таблицы категорий

Неактивен

 

#9 09.01.2014 14:44:46

new_saler
Участник
Зарегистрирован: 14.11.2012
Сообщений: 23

Re: Сортировка по нескольким условиям

Попробовал разбить данные на 2 таблицы: categories и forums

CREATE TABLE categories(
id int(10) UNSIGNED AUTO_INCREMENT,
cat_name varchar(80),
disp_position int(10))
ENGINE MyISAM DEFAULT charset=UTF8

CREATE TABLE forums(
id int(10) UNSIGNED AUTO_INCREMENT,
forum_name varchar(80),
disp_position int(10))
ENGINE MyISAM DEFAULT charset=UTF8

применив такой запрос:

SELECT c.id, c.cat_name, f.id, f.forum_name
FROM categories AS c
JOIN forums AS f ON c.id = f.cat_id
ORDER BY c.disp_position, f.disp_position

Вроде как получается выводит всё как надо.

Одной таблицей и одним запросом к сожалению так и не придумал.
Получается только если последующая сортировка средствами php согласно статье, приведенной выше.

Отредактированно new_saler (09.01.2014 15:05:22)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson