[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перекрестный запрос к БД
NierRa
Добрый день уважаемые форумчане! Помогите решить такую задачку...

Есть таблица в бд с такими полями:
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 -->


В итоге на выходе:

user posted imageuser posted image

Как составить запрос, чтобы в результате запроса получить:

user posted imageuser posted image

Очень подозреваю, что с помощью 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 определенного пункта меню из первой таблицы, то тогда можно было бы объединять как-то так:
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 поля - родитель и следующий пункт меню (не важно, какого уровня). Одним запросом к базе опять же все загоняем в массив, а потом рекурсивной функцией формируем строку пунктов меню. (Изврат, на мой взгляд, жуткий)


_____________
Задача на корректную обработку данных (мое решение)
http://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.