Antes de buscar una solucion como lo que pides, es mejor hacer lo que te indica @Leonardo, pon a tus tablas en segunda forma normal eliminando las dependencias parciales o puedes dar una mejor estructura a tu tabla, por ejemplo crear una columna que almacene el id del menu padre, si es 0 entonces es un menu padre.
la estructura podría ser:
+------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| parent_id | int(11) | NO | | 0 | |
| menu_order | int(11) | NO | | NULL | |
| permission | tinyint(2) | NO | | NULL | |
+------------+------------+------+-----+---------+----------------+
+----+-----------+------------+------------+
| id | parent_id | menu_order | permission |
+----+-----------+------------+------------+
| 1 | 0 | 1 | 2 |
| 2 | 1 | 2 | 1 |
| 4 | 1 | 3 | 3 |
| 5 | 0 | 1 | 4 |
| 6 | 5 | 2 | 5 |
| 7 | 5 | 3 | 3 |
| 8 | 0 | 1 | 5 |
| 9 | 8 | 2 | 5 |
+----+-----------+------------+------------+
de esta forma podrias hacer menus multi nivel.
para recuperar los datos, dependiendo los niveles del menu, podrias usar recursividad. en php seria algo asi:
<?php
$result = $mysqli->query(
'SELECT *
FROM menus
ORDER BY menu_order ASC');
$menus = array(
'parents' => array()
);
while($row = $result->fetch_assoc())
{
if($row['parent_id'] == 0)
{
$parent_pos = count($menus['parents']) + 1;
$menus['parents'][$row['id']] = array(
'position' => $parent_pos,
'parent' => $row,
'childrens' => array()
);
continue;
}
$actual_childrens = $menus['parents'][$row['parent_id']]['childrens'];
$row += array('position' => count($actual_childrens) + 1);
$menus['parents'][$row['parent_id']]['childrens'][] = $row;
}
foreach($menus['parents'] as $key => $parent)
{
echo '<div class="menu">' . sprintf('<strong>menu #%d</strong><ul>', $parent['position']);
foreach ($parent['childrens'] as $child) {
echo sprintf('<li>sub menu #%d.%d</li>', $parent['position'], $child['position']);
}
echo '</ul></div>';
}
menu #1
- sub menu #1.1
- sub menu #1.2
menu #2
- sub menu #2.1
- sub menu #2.2
menu #3
saludos!