Сложная сортировка в MySQL

wjeb

Новичок
Сложная сортировка в MySQL

Есть таблица, содержащая меню, страницы меню и их подменюю.

Делаю запрос:

select `name`, `type`, `menu`, `menu_id`, `sort_id` from `menu` order by `menu`, `menu_id`, `type`, `sort_id` ASC;

Всё структура при выводе хорошо формируется, но между собой упорядываются только подменю, а меню, и их страницы расположены в порядке возрастания по их иметам и типам.
т.е. первыми должны идти меню `primary_menu` так как имеют `sort_id` наименьший, за ними соответственно `menu_at_left` и `top_menu,
далее сортироваться по `sort_id` должны поля с типом(`type`) `menu` и только `sub`

Код:
+----------------+------+---------------------+---------+---------+
| name           | type | menu                | menu_id | sort_id |
+----------------+------+---------------------+---------+---------+
|                |      | menu_at_left        |       0 |       2 |
| menu_value_83  | menu | menu_at_left        |      83 |      15 |
| sub_value_184  | sub  | menu_at_left        |      83 |     113 |
| sub_value_185  | sub  | menu_at_left        |      83 |     114 |
| menu_value_84  | menu | menu_at_left        |      84 |      11 |
| sub_value_142  | sub  | menu_at_left        |      84 |      71 |
| sub_value_143  | sub  | menu_at_left        |      84 |      72 |
| sub_value_144  | sub  | menu_at_left        |      84 |      73 |
| menu_value_85  | menu | menu_at_left        |      85 |      16 |
| menu_value_86  | menu | menu_at_left        |      86 |      29 |
| menu_value_100 | menu | menu_at_left        |     100 |      37 |
| menu_value_108 | menu | menu_at_left        |     108 |      14 |
| sub_value_109  | sub  | menu_at_left        |     108 |      38 |
| sub_value_135  | sub  | menu_at_left        |     108 |      64 |
| sub_value_136  | sub  | menu_at_left        |     108 |      65 |
| sub_value_137  | sub  | menu_at_left        |     108 |      66 |
| menu_value_128 | menu | menu_at_left        |     128 |      57 |
| menu_value_129 | menu | menu_at_left        |     129 |      58 |
|                |      | primary_menu        |       0 |       1 |
| menu_value_45  | menu | primary_menu        |      45 |       4 |
| menu_value_46  | menu | primary_menu        |      46 |       5 |
| menu_value_47  | menu | primary_menu        |      47 |       6 |
| menu_value_48  | menu | primary_menu        |      48 |       7 |
| menu_value_49  | menu | primary_menu        |      49 |       8 |
| menu_value_50  | menu | primary_menu        |      50 |       9 |
| menu_value_51  | menu | primary_menu        |      51 |      10 |
| sub_value_148  | sub  | primary_menu        |      51 |      77 |
| sub_value_180  | sub  | primary_menu        |      51 |     109 |
|                |      | top_menu            |       0 |       3 |
| menu_value_88  | menu | top_menu            |      88 |      17 |
| sub_value_93   | sub  | top_menu            |      88 |      22 |
| sub_value_94   | sub  | top_menu            |      88 |      23 |
| sub_value_95   | sub  | top_menu            |      88 |      24 |
| sub_value_96   | sub  | top_menu            |      88 |      25 |
| sub_value_97   | sub  | top_menu            |      88 |      26 |
| menu_value_89  | menu | top_menu            |      89 |      18 |
| menu_value_90  | menu | top_menu            |      90 |      19 |
| menu_value_91  | menu | top_menu            |      91 |      20 |
| menu_value_92  | menu | top_menu            |      92 |      21 |
+----------------+------+---------------------+---------+---------+
Всё это желательно сделать одним запросом.
Вопрос: как ?
 

wjeb

Новичок
nirex можно прайс лист в таком случае публично выставить ? ;)


Неужели ни у кого нет идей ? Сейчас всё суётся в массив, и там сортируется.....
 

Gas

может по одной?
wjeb
думаешь кто-то понял что тебе нужно?
 

Bitterman

Новичок
wjeb
первыми должны идти меню `primary_menu` так как имеют `sort_id` наименьший, за ними соответственно `menu_at_left` и `top_menu,
далее сортироваться по `sort_id` должны поля с типом(`type`) `menu` и только `sub`
При существующей структуре так сделать нельзя.
 

wjeb

Новичок
Bitterman
на будущее - как пересмотреть структуру, чтобы можно было ?
 

Gas

может по одной?
думаю через несколько derived queries можно и эту неправильную структуру отсортировать, но я так и не понял что автору нужно.
 

Bitterman

Новичок
Gas
Насколько я понял, ТС хочет получить тот же список, что и в первом посте, но сначала должны идти элементы со значением поля menu = primary_menu (т. к. у элемента с menu_id = 0 поле sort_id равно 1), затем поля с menu = menu_at_left (т. к. sort_id равно 2) и т. д.
Возможно, как-то хитро извернувшись, это и можно сделать, но, ИМХО, ТСу об этом лучше не знать...
 
Сверху