Получать группы товаров и товары одним запросом - PullRequest
0 голосов
/ 11 января 2011

У меня есть две таблицы:

Product
------------------------------------
id   group_id   name   quick_select
------------------------------------
1      1       product1      1
2      3       product2      0
3      5       product3      1

Product_group
-----------------------
id   name   parent_id
-----------------------
1   group1     0
2   group2     0
3   group3     1
4   group4     1
5   group5     3

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

В моем запросе я хочу выбрать все корневые категории (где parent_id = 0), если в них есть товары, а также их подкатегории и подкатегории и т. Д., Где quick_select должен быть 1 в таблице товаров. И я не знаю глубины категорий - сколько уровней.

Возможно ли с одним запросом? Или мне нужно сделать два запроса?

Я сделал до сих пор, с этим запросом:

SELECT pg.id, pg.name, pg.parent_id AS parent_id
FROM product_group AS pg
LEFT JOIN product AS p ON pg.id = p.group_id
WHERE pg.parent_id = 0 AND p.id IS NOT NULL AND p.quick_select = 1
GROUP BY pg.id

Но я не получаю корневые категории, подкатегория которых пуста, какая подкатегория пуста, и под ней находится еще одна подкатегория с продуктами с quick_select = 1.

Извините за мой плохой английский.

Я хочу получать все категории, в которых есть продукты с quick_select = 1, а не продукты

-- Category
|     |
|   product
|
-- Category
      |
   Category
      |
   Category
      |
 multiple products 

1 Ответ

1 голос
/ 11 января 2011

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

Если важна выбор производительности, вы можетепопытайтесь упорядочить данные следующим образом: http://articles.sitepoint.com/article/hierarchical-data-database/2

Другой вариант - добавить корневой идентификатор в каждую строку во время ввода.

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

Обновление: Хорошо, это очень много псевдокода, но он должен вас туда доставить.

Вам нужен язык, который имеет своего рода hashmap или именованный массивтип данных.

hashmap results, parent, nodes, nodes_new; # variables


foreach  (res in sql_execute("SELECT id, parent_id FROM product_group;") ) {
    parent[res.id] = res.parent_id;
}

# get groups with products
foreach  (res in sql_execute("SELECT pg.id FROM product_group AS pg INNER JOIN 
        product AS p ON pg.id = p.group_id 
        WHERE p.quick_select = 1 GROUP BY pg.id ") ) {
    nodes[res.id] = res.id;
}

while (length(nodes) > 0) {
    foreach (i in nodes) {
        if (i = 0) { results[i] = i; } # if its a root node, add to results
        else { nodes_new[parent[i]] = parent[i]; } # otherwise, add parent to the next round
    }
    nodes = nodes_new; # prepare for next round
}

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