【问题标题】:Use column value in other select在其他选择中使用列值
【发布时间】:2018-11-28 09:50:55
【问题描述】:

我想选择每个类别,并计算该类别及其所在的每个子类别中的每个产品的数量。

此 SQL QUERY 返回 ID 为 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)   |
+-----------------------+

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    错误信息中是否有线路被感染?在我看来问题是

    (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
    

    【讨论】:

    • 我已经尝试过了,但是现在 productos 列总是返回 0
    • 如果你给我表格的结构和一些数据,我会尽力帮助你
    • 我已将它们添加到问题中
    • 如果我错了,请纠正我:在类别中也有 pos 和 active 字段(我分别将它们设置为 1 和 TRUE 以进行我的测试)并且在 productos 中你错过了 active(我将其设置为 TRUE在每一行)。这是我在productos上使用的插入:INSERT INTO PRODUCTOS VALUES (1,'A','A','A',1.5,1,1,TRUE), (2,'B','B',' B',2.5,1,1,TRUE), (3,'C','C','C',2.5,2,1,TRUE), (6,'H','H','H' ,2.5,3,1,TRUE), (4,'D','D','D',8.5,4,1,TRUE), (7,'G','G','G',2.6 ,3,4,TRUE), (5,'E','E','E',0.5,5,3,TRUE), (8,'F','F','F',2.2,3 ,1,TRUE);
    • 也许它没有意义,但它似乎工作。我的意思是,对于这些数据,productos 列在每一行中都包含 1。如果不好,请给我一些数据以在产品中使用,如果可能的话,甚至是您期望的结果。
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2022-07-06
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多