Есть таблица в бд с такими полями:
id|name|transition|
1|Головна|home
2|Про нас|about
3|Галерея|gallery
4|Вакансії|vacancy
5|Контакти|contacts
и есть таблица с такими полями:
id|name|transition|
1|Лицензия|license
2|Послуги|service
3|Партнери|partners
и еще таблица с такими полями:
id|name|transition|
1|Головний офiс|main
2|Менеджери|managers
3|Магазини|shops
<div class="content">
<ul>
<li><a href="?transition=menu">Навигация</a></li>
<ul>
<?php $query = mysql_query ("SELECT `name`, `transition` FROM `menu` ORDER BY `key`", $auto) or die(mysql_error());
while($res = mysql_fetch_assoc($query)) : ?>
<li><a href="?transition=<?php echo htmlspecialchars($res['transition']); ?>"><?php echo htmlspecialchars($res['name']); ?></a></li>
<?php endwhile; ?>
</ul>
</ul>
</div> <!-- endClass .content -->
В итоге на выходе:
Как составить запрос, чтобы в результате запроса получить:
Очень подозреваю, что с помощью LEFT JOIN, но самостоятельно составить запрос не могу.
Благодарю...
Спустя 11 часов, 23 минуты, 26 секунд (2.08.2012 - 10:34) NierRa написал(а):
ап тему
Спустя 6 минут, 7 секунд (2.08.2012 - 10:40) kamanch написал(а):
Никак.
У тебя архитектура базы неверная.
Если готов менять базу, тогда можно подискутировать.
У тебя архитектура базы неверная.
Если готов менять базу, тогда можно подискутировать.
Спустя 7 минут, 41 секунда (2.08.2012 - 10:48) Placido написал(а):
Для того чтобы объединить таблицы, они должны быть связаны по каким-то полям. Например, если бы во второй и третьей таблице было еще одно поле `parent`, где указывалось бы id определенного пункта меню из первой таблицы, то тогда можно было бы объединять как-то так:
И вообще, в этом случае можно было бы использовать одну таблицу. Гуглите хранение древовидных структур в реляционных БД, метод смежных вершин или adjacency list.
SELECT ... `первая таблица`
LEFT JOIN `вторая таблица` ON `первая таблица`.`id` = `вторая таблица`.`parent`
LEFT JOIN `третья таблица` ON `первая таблица`.`id` = `третья таблица`.`parent`
И вообще, в этом случае можно было бы использовать одну таблицу. Гуглите хранение древовидных структур в реляционных БД, метод смежных вершин или adjacency list.
Спустя 58 минут, 30 секунд (2.08.2012 - 11:47) NierRa написал(а):
Цитата |
Если готов менять базу, тогда можно подискутировать. |
Готов. До этого момента не было надобности в таком запросе, поэтому база имеет такой вид
Цитата |
И вообще, в этом случае можно было бы использовать одну таблицу |
Спасибо, однако хотелось бы решить данную задачку хотя бы для общего развития
Спустя 22 минуты, 22 секунды (2.08.2012 - 12:09) kamanch написал(а):
Тебе необходима, как уже сказал Placido, всего одна таблица.
Но в ней добавляется поле parent (родитель)
id|name|transition|parent
// Так же можно ввести еще одно поле, которое будет отвечать за сортировку пунктов меню.
Если parent = 0, значит это меню верхнего уровня.
При такой организации таблицы ты с легкостью можешь манипулировать расположением пунктов меню. Меняешь пункту родителя, и он уже совсем в другой ветке.
В выводе ты используешь список.
"В лоб" сформировать его не получится, т.к. нет гарантии, что в таблице сначала идет родитель, потом все его потомки, потом другой родитель со своими потомками.
Поэтому тут несколько вариантов:
1. Делаешь сначала запрос всех родителей. Затем в цикле для каждого родителя выбираешь его потомков.
2. Собираешь все пункты в массив, а затем уже бегаешь по массиву, собирая строку из <ul> или <li> элементов.
3. (видел такое в xy:Commerce) В таблицу добавляется 2 поля - родитель и следующий пункт меню (не важно, какого уровня). Одним запросом к базе опять же все загоняем в массив, а потом рекурсивной функцией формируем строку пунктов меню. (Изврат, на мой взгляд, жуткий)
Но в ней добавляется поле parent (родитель)
id|name|transition|parent
// Так же можно ввести еще одно поле, которое будет отвечать за сортировку пунктов меню.
Если parent = 0, значит это меню верхнего уровня.
При такой организации таблицы ты с легкостью можешь манипулировать расположением пунктов меню. Меняешь пункту родителя, и он уже совсем в другой ветке.
В выводе ты используешь список.
"В лоб" сформировать его не получится, т.к. нет гарантии, что в таблице сначала идет родитель, потом все его потомки, потом другой родитель со своими потомками.
Поэтому тут несколько вариантов:
1. Делаешь сначала запрос всех родителей. Затем в цикле для каждого родителя выбираешь его потомков.
2. Собираешь все пункты в массив, а затем уже бегаешь по массиву, собирая строку из <ul> или <li> элементов.
3. (видел такое в xy:Commerce) В таблицу добавляется 2 поля - родитель и следующий пункт меню (не важно, какого уровня). Одним запросом к базе опять же все загоняем в массив, а потом рекурсивной функцией формируем строку пунктов меню. (Изврат, на мой взгляд, жуткий)
_____________
Задача на корректную обработку данных (мое решение)
http://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/