Использовать значение столбца в другом выборе - PullRequest
0 голосов
/ 28 ноября 2018

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

Этот SQL-запрос QUERY возвращает количество продуктов, которые имеет категория с идентификатором X, имея в виду свои продукты подкатегории.

SELECT
    count(*)
FROM productos
INNER JOIN categorias
ON categorias.id = productos.categoria_id
WHERE productos.categoria_id IN (select  id
        FROM    (SELECT * FROM categorias
                 ORDER BY parent, id) products_sorted,
                (SELECT @pv := X) initialisation
        WHERE   find_in_set(parent, @pv)
        AND     length(@pv := concat(@pv, ',', id))
        OR      id = @pv)
        AND productos.active IS TRUE AND categorias.active IS TRUE
ORDER BY categorias.pos) as productos

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

SELECT
    cats.*,
    (SELECT
        count(*)
    FROM productos
    INNER JOIN categorias
    ON categorias.id = productos.categoria_id
    WHERE productos.categoria_id IN (select  id
            FROM    (SELECT * FROM categorias
                     ORDER BY parent, id) products_sorted,
                    (SELECT @pv := cats.id) initialisation
            WHERE   find_in_set(parent, @pv)
            AND     length(@pv := concat(@pv, ',', id))
            OR      id = @pv)
            AND productos.active IS TRUE AND categorias.active IS TRUE
    ORDER BY categorias.pos) as productos
FROM categorias AS cats ORDER BY cats.parent, cats.pos

Таблицы

+----------------------+
| Catrgorias           |
+----------------------+
| id (int 11)          |
+----------------------+
| nombre (varchar 255) |
+----------------------+
| parent (int 11)      |
+----------------------+
| active (tinyint 11)  |
+----------------------+
| pos (int 11)         |
+----------------------+
+----+------------+--------+
| id | nombre     | parent |
+----+------------+--------+
| 1  | Cat1       | NULL   |
+----+------------+--------+
| 2  | Cat2.      | NULL   |
+----+------------+--------+
| 3  | SubCat1    | 1      |
+----+------------+--------+
| 4  | SubCat2    | 2      |
+----+------------+--------+
| 5  | SubSubCat1 | 3      |
+----+------------+--------+


+-----------------------+
| Productos             |
+-----------------------+
| id (int 11)           |
+-----------------------+
| name (varchar 255)    |
+-----------------------+
| description (text)    |
+-----------------------+
| image (varchar 255)   |
+-----------------------+
| price (decimal 11,2)  |
+-----------------------+
| categoria_id (int 11) |
+-----------------------+
| pos (int 11)          |
+-----------------------+
| active (tinyint 11)   |
+-----------------------+

1 Ответ

0 голосов
/ 28 ноября 2018

В сообщении об ошибке есть строка заражена?На мой взгляд, проблема в

(SELECT @pv := cats.id)

, которую я бы изменил в

(SELECT @pv := id FROM CATEGORIAS)

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

Чтобы получить тот же результат, я напишу что-то подобное, проверьте, работает ли он (вы уверены в числах, которые вы написали в комментарии?)

SELECT ID, SUM(N) FROM
#COLL DIRETTI
((SELECT A.ID AS ID, COUNT(*) AS N
FROM CATEGORIAS A
LEFT JOIN PRODUCTOS B
ON A.ID = B.CATEGORIA_ID
WHERE A.ACTIVE IS TRUE AND B.ACTIVE IS TRUE
GROUP BY A.ID)
UNION ALL
#PRIMA GENERAZIONE
(SELECT C.PARENT AS ID, D.N AS N
FROM CATEGORIAS C
LEFT JOIN (SELECT A.ID, COUNT(*) AS N
FROM CATEGORIAS A
LEFT JOIN PRODUCTOS B
ON A.ID = B.CATEGORIA_ID
WHERE A.ACTIVE IS TRUE AND B.ACTIVE IS TRUE
GROUP BY A.ID) D
ON C.ID = D.ID
WHERE C.PARENT IS NOT NULL
AND D.N IS NOT NULL)
UNION ALL
#SECONDA GENERAZIONE
(SELECT CC.PARENT AS ID, DD.N AS N
FROM
(SELECT AA.ID AS ID, BB.PARENT AS PARENT
FROM CATEGORIAS AA
LEFT JOIN CATEGORIAS BB
ON AA.PARENT=BB.ID
WHERE BB.PARENT IS NOT NULL) CC
LEFT JOIN (SELECT A.ID, COUNT(*) AS N
FROM CATEGORIAS A
LEFT JOIN PRODUCTOS B
ON A.ID = B.CATEGORIA_ID
WHERE A.ACTIVE IS TRUE AND B.ACTIVE IS TRUE
GROUP BY A.ID) DD
ON CC.ID = DD.ID
WHERE DD.N IS NOT NULL)
UNION ALL
#TERZA GENERAZIONE
(SELECT CCC.PARENT AS ID, DDD.N AS N
FROM
(SELECT AA.ID AS ID, CC.PARENT AS PARENT
FROM CATEGORIAS AA
LEFT JOIN CATEGORIAS BB
ON AA.PARENT=BB.ID
LEFT JOIN CATEGORIAS CC
ON BB.PARENT=CC.ID
WHERE CC.PARENT IS NOT NULL) CCC
LEFT JOIN (SELECT A.ID, COUNT(*) AS N
FROM CATEGORIAS A
LEFT JOIN PRODUCTOS B
ON A.ID = B.CATEGORIA_ID
WHERE A.ACTIVE IS TRUE AND B.ACTIVE IS TRUE
GROUP BY A.ID) DDD
ON CCC.ID = DDD.ID
AND DDD.N IS NOT NULL)) TOT
GROUP BY ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...