Как получить категорию первого уровня для отображения только один раз? - PullRequest
0 голосов
/ 14 октября 2011

У меня есть таблица, настроенная в mysql следующим образом:

Я хотел бы создать навигацию по категориям боковой панели с родительской категорией - подкатегориями - и возможными категориями третьего уровня, которыеЯ сохранил в другой таблице.

Я пытаюсь заставить их отображаться в древовидной структуре следующим образом:

Ночь

  • Клубы и сообщества
  • Публичные дома
  • Рестораны
  • Такси и прокат автомобилей
  • Театры и концертные залы
  • Винные бары

Проживание

  • Кровать и завтрак
  • Гостевые дома
  • Курортное размещение
  • Отели
  • Самообслуживание Размещение

Сельское хозяйство

  • Сельскохозяйственные машины и запасные части
  • Сельскохозяйственные торговцы
  • Корма для животных
  • Страна износа
  • Молочные продукты

и т. Д.

На данный момент я могу создать фоллwing:

с использованием этого кода:

$dbc = mysql_connect($db_host,$db_user,$db_pass);
$sdb = mysql_select_db($db_database);

$query = 'SELECT category_name, subcategory_name FROM categories, subcategories WHERE subcategory_parent = category_name';

$result = mysql_query($query, $dbc)
or die (mysql_error($dbc));

while($row = mysql_fetch_array($result)) {

$catname = $row["category_name"];
$subcatname = $row["subcategory_name"];

echo "<li>$catname</li><ul><li>$subcatname</li></ul>";
}

Я хочу, чтобы категория первого уровня отображалась только один раз с подкатегориями в списке под ними.,Может кто-нибудь сказать мне наиболее эффективный способ сделать это?Я думаю, что мне нужно использовать foreach, но я не уверен.

Таблица категорий третьего уровня, которую я настроил, имеет ту же структуру, что и эта таблица, но это subsubcategory_id / subsubcategory_parent / subsubcategory_name.

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

выводит catname только при его изменении.Вам также нужно сначала упорядочить запрос по имени категории.

$row = mysql_fetch_array($result);
$catname = $row["category_name"];
$subcatname = $row["subcategory_name"];
$last = $catname;

echo "<li>$catname</li><ul>"

while($row = mysql_fetch_array($result)) {
    $catname = $row["category_name"];
    $subcatname = $row["subcategory_name"];
    if($last != $catname){
        echo "</ul><li>$catname</li><ul>"
    }
    echo "<li>$subcatname</li>";
    $last = $catname;
}
echo "</ul>";

Редактировать: просто перечитайте вопрос полностью и хотите сказать, что когда речь идет об иерархических деревьях, с использованием родительского / дочернего элемента (или категории/ sub / subsub) не лучший метод.Несмотря на то, что это работает, для отображения обычно требуется несколько запросов и рекурсивные функции.Лучше всего использовать вложенный набор , который создан именно для этой цели.

1 голос
/ 14 октября 2011

Я бы упростил структуру данных, если вам нужна возможность многоуровневых подкатегорий (что, как вы сказали, возможно).Лучший способ найти что-то подобное - это сделать что-то немного другое с данными:

category
+----+-----------+------------+----------------------------+
| id | parent_id | sort_order | name                       |
+----+-----------+------------+----------------------------+
| 1  | 0         | 0          | A Night Out                |
| 2  | 1         | 1          | Clubs and Societies        |
| 3  | 1         | 2          | Public houses              |
| 4  | 1         | 3          | Restaurants                |
| 5  | 1         | 4          | Taxis ...                  |
| 6  | 1         | 5          | Theatres ...               |
| 7  | 1         | 6          | Wine Bars                  |
| 8  | 0         | 0          | Accommodation              |
| 9  | 8         | 1          | Bed and Breakfast          |
| 10 | 8         | 2          | Guest Houses               |
| x  | x         | x          | ... and so on ...          |
+----+-----------+------------+----------------------------+

Примечание: я только , использую sort_order для сортировки подочерние узлы с одним и тем же родителем.

Теперь я бы создал действительно простой SQL-запрос, чтобы просто получить данные, упорядоченные по parent_id затем sort_order:

SELECT category.id, category.parent_id, category.name FROM category ORDER BY category.parent_id ASC, category.sort_order ASC

Теперь прибываетзабавная часть ... потому что, на самом деле, нам нужны структурированные данные, поэтому я бы передал запрос в XML DOMDocument () для создания системы структурированных категорий.

По сути, вы перебираете данные и, выполняя этот цикл, вы создаете узлы с идентификатором, например, node_{$category_id}, и затем вы можете назначить дочерние узлы их родителям в правильном порядке.Затем вы можете использовать стандартную DOM-навигацию для получения нужного дерева данных.

Самое большое преимущество в этом заключается в том, что вы можете начать с любого дочернего узла и вернуться обратно к дереву узлов, чтобы создатьсписок вашей категории - это означает, что вы можете развернуть и свернуть его.

Недавно я написал гораздо более подробное объяснение;Я могу опубликовать ссылку на него, если хотите.

1 голос
/ 14 октября 2011

Я думаю, вам нужно что-то вроде этого:

$cat_query = mysql_query("SELECT * FROM `TABLE_NAME` GROUP BY `subcategory_parent`") or die(mysql_error());

while($r_cat = mysql_fetch_array($cat_query)) {

    $cat_name = $r_cat['subcategory_parent'];

    echo("$cat_name<br />");

    $sub_cat_query = mysql_query("SELECT * FROM `subcategory_name` WHERE (`subcategory_parent` = '$cat_name')") or die(mysql_error());

    while($r_sub_cat = mysql_fetch_array($sub_cat_query)) {

        $sub_cat_name = $r_sub_cat['subcategory_name'];

        echo(" - $sub_cat_name<br />");

    }

    echo("<br />");

}

Вероятно, есть более эффективный способ сделать это, многие ребята здесь гораздо более осведомлены в этой области, но это должно сработать! Вы также можете проверить, имена таблиц / заголовки столбцов и т. Д., Чтобы убедиться, что они соответствуют вашей базе данных.

...