Получить количество элементов в дочерних категориях данной категории в MySQL - PullRequest
1 голос
/ 15 декабря 2010

Скажем, у нас есть эти таблицы

t1
--------------------------------
category_id | name | lft | rgt
--------------------------------
1             cat1   1     8
2             cat2   2     3
3             cat3   4     7
4             cat4   5     6

t2
-------------------------------
item_id | category_id
--------------------------------
 1          1
 2          2
 3          3
 4          4

Есть ли способ в MySQL получить количество элементов, которые есть у категории (включая те элементы, которые принадлежат ее дочерним элементам)? Как то так ...

-------------------------------
category_id | item_count
--------------------------------
 1              4
 2              1
 3              2
 4              1

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

SELECT category_id FROM t1 WHERE <some conditions here>

SELECT 
  COUNT(*) AS item_count,
  category_id
FROM
  t2
WHERE
  t2.category_id IN 
  (
 SELECT  
      node.category_id
 FROM 
  t1 AS node,
     t1 AS parent
    WHERE
  node.lft BETWEEN parent.lft AND parent.rgt
     AND parent.category_id = 5 <---- How do I pass the category ids of the first query
                                      here?
  )        

1 Ответ

1 голос
/ 15 декабря 2010
SELECT a.category_id, COUNT(a.item_id) as itemcount 
FROM itemTable a 
GROUP BY a.category_id;

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

РЕДАКТИРОВАТЬ: Хорошо, поэтому проблема заключается в получении значения вПодвыбрать ... Я не эксперт по SQL, но я предлагаю создать представление.

SELECT category_id FROM t1 WHERE <some conditions here>
CREATE VIEW temp AS
 SELECT  
  node.category_id as nc_id, parent.category_id as pc_id
 FROM 
  t1 AS node,
  t1 AS parent
 WHERE
  node.lft BETWEEN parent.lft AND parent.rgt;

VIEW temp
nc_id | pc_id
1   1
2   1
3   1
4   1
2   2
3   2
4   3


t2
itemid| catid
1   1
2   2
3   3
4   4

CREATE VIEW temp2 AS
   SELECT 
     *
   FROM
     t2, temp
   WHERE t2.category_id = temp.nc_id OR t2.category_id = temp.pc_id

cat_id| itemid |nc_id | pc_id
1   1   1   1
1   1   2   1
1   1   3   1
1   1   4   1
2   2   2   1
2   2   2   2
2   2   3   2
3   3   3   1
3   3   3   2
3   3   4   3
4   4   4   1
4   4   4   3

CREATE VIEW temp3 AS
SELECT cat_id, itemid, nc_id, pc_id
FROM temp2
GROUP BY item_id, nc_id;

temp3:
cat_id| itemid |nc_id | pc_id
1   1   1   1
1   1   2   1
1   1   3   1
1   1   4   1
2   2   2   1
2   2   3   2
3   3   3   1
3   3   4   3
4   4   4   1

SELECT count(itemid) AS itemcount, cat_id
FROM temp3
GROUP BY cat_id;

itemcount      |cat_id
4       1
2       2
2       3
1       4

DROP VIEW temp3;
DROP VIEW temp2;
DROP VIEW temp;

И на этом мой ответ заканчивается.Я надеюсь, что это сработает, и я также надеюсь, что вы можете исправить мой беспорядок (с точки зрения оптимизации того, что я написал)

...