Всем привет! Есть две базы: категории - id, cat_name, parent_id товары - id, prod_name, parent_cat Нужно вывести в формате: Код (Text): кат1 тов1 тов2 кат2 тов4 тов6 Не соображу, как запрос составить, подскажите, в какую сторону смотреть
две таблицы сортируйте по категории потом по товару. а для того чтоб вывести такой вот елочкой - уже дополнительный код будет нужен кстати если вы хотите вложенность категорий реализовать то рекомендую сразу на nested sets посмотреть.
Я бы поступил так: Выбрал бы все из двух баз сразу, т.е. Код (Text): SELECT f.cat_name, f.parent_id, s.id, s.prod_name, s.parent_cat FROM f LEFT JOIN s ON s.parent_cat=f.id ORDER BY f.cat_name, s.prod_name Далее все данные сохранил бы в массив таким образом: Код (Text): $array['cats'][ $row['parent_cat'] ] = $row['cat_name']; // Список категорий $array['tovs'][ $row['parent_cat'] ][] = $row; // Список товаров по категориям Далее этот массив можно вывести в шаблонизаторе, либо посто ниже в коде таким образом: Код (Text): echo '<ul>'; // Откроем список категорий foreach ( $array['cats'] as $key=>$value ) { // Переберем категории echo '<li>'.$value.''; // Выведем название категории echo '<ul>'; // Откроем список товаров foreach ( $array['tovs'][$key] as $tov ) { // Переберем товары echo '<li>'.$tov['prod_name'].'</li>'; // Выведем название товара. Используя другие значения, можно сделать ссылку, чекбокс для формы и т.п. } echo '</ul></li>'; // Закроем список товаров и категорий } echo '</ul>'; // Закроем список категорий
из двух таблиц. шож вы все постоянно терминологию нарушаете? дерево категорий-товаров как будет выглядеть в вашем решении?
Конечно, Вы правильно меня поправили. Не из двух баз, а из двух таблиц. Моим клиентам чаще понятнее слово "база", чем "таблица", отсюда и привычка называть таблицы базами. Дерево будет выглядеть так, как просил автор. Я же код привел для примера. Вот так будет: Код (Text): <ul> <li>Категория 1<ul> <li>Товар 1</li> <li>Товар 2</li> <li>Товар 3</li> </ul></li> </ul> Если на jQuery дописать код, который будет по клику на "<ul><li>" открывать вложенный скрытый <ul>, то получим еще и раскрывающийся список. Точно таким же образом я делал левое меню для сайта http://точкалояльности.рф/
а сразу дерево как вывести? одной итерацией и без всяких там дополнительных плагинов? автор может и просил показать одноуровневые связки категория+товар-в-категории. но в его коде есть упоминание родительской категории для категории. значит можно требовать вывести дерево категорий-подкатегорий-подподкатегорий-товаров. одна итерация, без лишних модулей. поехали.
В самом начале я написал: "Я бы поступил так". Я не писал: "Единственно верный вариант - это...". Если взять задачу с множеством вложенных категорий, то я бы поступил так: начало кода такое же. Мы выбираем данные в массив. Однако массив категорий будет выглядеть не так: Код (Text): $array['cats'][ $row['parent_cat'] ] а так: Код (Text): $array['cats'][ $row['parent_id'] ][ $row['parent_cat'] ] Ну и где вывод в текст сделать это через функцию: Код (Text): // Покажем товары function showtov( $parent_id ) { global $array; if ( sizeof( $array['tovs'][ $parent_id ] ) > 0 ) { echo '<ul>'; foreach ( $array['tovs'][ $parent_id ] as $tov ) { echo '<li>'.$value.'</li>'; } echo '</ul>'; } } // Покажем вложенные категории function showcat( $parent_id ) { global $array; if ( sizeof( $array['cats'][ $parent_id ] ) > 0 ) { echo '<ul>'; foreach ( $array['cats'][ $parent_id ] as $key=>$value ) { echo '<li>'.$value; showcat( $key ); showtov( $key ); echo '</li>'; } echo '</ul>'; } } // Выведем на экран корневые категории showcat( 0 ); Естественно, в данном случае использовать просто ul и li недостаточно - надо либо другие теги, либо классы добавить, чтобы разделить товары и категории визуально. Но это уже задача для конкретного сайта. Повторюсь - я не говорил, что это единственно верный способ решения. Если Вы имеете более элегантный вариант решения - предложите. Я с радостью и сам возьму его на вооружение
Но ведь у автора таблица уже существует. Конечно, ее можно переделать, но вопрос был в том, как, используя текущую структуру, показать элементы в определенном виде. Для автора мой вариант все-же будет проще.
во-первых, все же пишется не все-же, а все же. во-вторых, для односложных каталогов можно и ваше решение. никто не спорит. но я вот увидел у автора вложенность категорий и тут же предложил наиболее подходящую технологию для обслуживания иерархической структуры, коей и является каталог товаров. согласитесь, вы не смогли обеспечить меня кодом, выводящим красивое дерево из той структуры, которая есть у автора. потому что структура некрасивая. и любой инструмент с нею работающий будет по умолчанию некрасивым. нс дает возможность построить дерево одной лишь итерацией результата одного лишь запроса к субд. никаких вложенных итераций. один простой цикл. нс позволяет легко выбрать путь/ветку/всё дерево. мы легко сможет построить такую плюшку, как хлебные крошки. мы легко сможем делать ссылки на товары в разных категориях. и нам для этого не надо будет делать стек рекурсивных вызовов showcat-showcat-showcat-showcat-showcat-showcat-showcat-showcat и так далее до фатала лимита рекурсии. и вам тоже рекомендую ознакомиться с вложенными множествами. удачи.
Ваш ответ реализует не ту логику, которая нужна автору. Он отблагодарил меня за совет про вложенные множества, следовательно он как раз стремится реализовать не плоский каталог категория-товар, а нечто гибкое с лимитом уровней подчинения ограниченным собственной фантазией администратора каталога. Гибкость предложенного мною решения я привел комментарием ранее. То есть у моего решения плюсов больше, чем минусов. Ваш код работает либо с плоским каталогом (читаем выше про "не то, что хотят". 1-0), либо заставляет писать избыточный код для реализации подчинений. Напомню, лимит вложенности каталога будет равен лимиту рекурсии стека функций. То есть в дополнение к тому что программисту будет сложно обслуживать этот код (2-0) мы получаем еще и бомбу того что конечный пользователь рано или поздно может случайно создать слишком глубокую категорию, которая будет регулярно подкладывать статус 500 (3-0). Плоский каталог конечно может обработать каждый уважающий себя начинающий программист. Но засчитаем работу с плоским каталогом как плюс вашего решения. НС в данном случае конечно отсасывают накладными расходами на организацию иерархии. (3-1). А нет... НС дает возможность сортировать элементы в каталоге без лишних полей в базе. В том числе и для одного уровня. Таки 4-0. Ну конечно же это еще не всё. Путь(5-0)/ветка(6-0)/дерево(7-0). Симлинки на товары/категории - 8-0. Хлебные крошки - 9-0. Они конечно вытекают (высыпаются, если хотите) из функционала путь/ветка/дерево, но для их обработки не нужно лишних телодвижений. Вообще для готовой страницы каталога нужен один запрос и одна итерация результата. Можно 10-0? Ну пжалста-пжалста-пжалста... Обратите внимание на тот факт что я ни разу не назвал ваше решение "неправильным" как вы его сами обозвали. Я лишь просил показать гибкость и мощность вашего решения для сравнения с предложенным мною подходом. Вероятно, у вас еще мало опыта и вы боитесь такой технологии как вложенные множества, но поверьте мне уж лучше один раз понять как они работают, чем громоздить вот такие конструкции как вы привели. Опять же я не утверждаю что мое решение единственно верное в природе. Но если кто-то предложит что-то свое - я с удовольствием ознакомлюсь и приму к сведению. Вдруг оно мне чем-то будет полезно. Успехов.