Вложенное модельное меню на сайте электронной коммерции - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть база данных с таблицей категорий, использующая вложенный подход в MySql.Но я продолжаю бить стену.Сайт содержит «разделы» видов (так как это зоомагазин).У меня уже есть запрос, который возвращает все категории, в которых есть продукты для каждого вида.

Теперь моя проблема в том, что я хочу, чтобы я мог показывать только те категории, в которых есть продукты.Например, если я создаю категорию food с ребенком adult.Тогда система не должна перечислять категории по каким-либо видам.Но как только я создаю Продукт в категории adult, система должна перечислить Food с дочерним элементом Adult.

В настоящее время таблица имеет следующую структуру:

Категория:

  • id
  • top
  • name
  • lft
  • rgt
  • создано (для полноты)
  • последнее обновление (для полноты)

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

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

Обновление:

Запрос, который я использую для получения категорий:

SELECT node.id as nid, node.top as top, node.*, brands.name as brandname from
brands, foods, foodcategories, categories as node, categories as parent WHERE 
node.lft BETWEEN parent.lft AND parent.rgt AND parent.top=1 AND 
foodcategories.food=foods.id AND foodcategories.category=node.id 
AND brands.id=foods.brand AND foods.species={speciesid}

Затем я выполняю запрос, чтобы получить все категории и их lft, rgt.Из которого я могу построить дерево.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Как-то так должно работать:

$q = mysql_query("SELECT a.* FROM Categories a WHERE a.id IN (SELECT categoryID FROM Products)");

ИЛИ

$q = mysql_query("SELECT a.* FROM Categories a WHERE (SELECT count(*) FROM Products WHERE categoryID = a.id) >= 1");  

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

РЕДАКТИРОВАТЬ:

Я понимаю, что вы пытаетесь достичь, я думаю, но все еще нетпонять структуру вашей базы данных.Для 1 уровня подкатегорий я бы сделал что-то вроде:

echo '<ul>';
$q = mysql_query("SELECT a.* FROM Categories a, SubCategories b WHERE a.ID = b.categoryID AND (SELECT count(*) FROM Products WHERE SubCategoryID = b.id) >= 1");
while($f = mysql_fetch_array($q)) {
    echo '<li>'.$f['Category'];
    $qsc = mysql_query("SELECT b.* FROM SubCategories b WHERE (SELECT count(*) FROM Products WHERE SubCategoryID = b.id) >= 1");
    if (mysql_num_rows($qsc) > 0) {
        echo '<ul>';
    }
    while($fsc = mysql_fetch_array($fsc)) {
        echo '<li>'.$fsc['SubCategory'].'</li>';
    }
    if (mysql_num_rows($qsc) > 0) {
        echo '</ul>';
    }   
    echo '</li>';   
}
echo '</ul>';

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

1 голос
/ 12 сентября 2011

Через пару дней, наконец, придумал решение и внедрил его.

Я могу выполнить следующий запрос и получить полный путь к категории и из категории,

(SELECT cast(group_concat(parent.id SEPARATOR '-') AS char) as catpath
            FROM categories AS node,
                    categories AS parent
            WHERE node.lft BETWEEN parent.lft AND parent.rgt
                    AND node.id=categories.id
            ORDER BY node.lft )

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

Это довольно много циклов. Поэтому я кеширую меню и генерирую его только раз в 5 минут.

Вот и все! 3 запроса!

  • Один для списка видов.
  • Один для всех категорий, которые имеют продукты в них.
  • Один для всех категорий, которые я повторяю, чтобы найти один с определенным идентификатором.

На следующий вызов!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...