-1

我需要一些关于视图的帮助。

我有 2 个表需要“合并”在一起。

第一个表包含有关产品的信息(product-color-size),其他表包含有关 product-season-color-size niveau 的库存、已售、可用(数量)等信息。

我需要我的观点来返回可用的公关产品。相同的 product-color-size 可以多次(可以在多个季节),因此我不能只对可用的 ex 进行求和。

我的查询看起来像这样

SELECT
    SUM((
        SELECT
            SUM(products_details.available)
        FROM
            products_details
        WHERE
            products_details.product_id = products.id
    )) AS available
FROM
    products

但是,这行不通。如果一种尺寸有 6 可用,而另一种尺寸有 -5,则查询将返回 1 可用。但是,我实际上得到了 6 个,我可以卖掉。

因此我需要做一些调整

SELECT
    SUM((
        SELECT
            SUM(
                IF(
                    products_details.available > 0,
                    products_details.available,
                    0
                )
            )
        FROM
            products_details
        WHERE
            products_details.product_id = products.id
    )) AS available
FROM
    products

但是,这也行不通。如果大小在一个季节有 6 个可用,而在另一个季节有 -5,则查询将返回 6 个可用。但是,这两行我需要求和,因为它是同一个产品。因此它需要返回 1 可用。

所以,我想出了

SELECT
    SUM(
        IF(
            (
                SELECT
                    SUM(
                        IF(
                            products_details.available > 0,
                            products_details.available,
                            0
                        )
                    )
                FROM
                    products_details
                WHERE
                    products_details.product_id = products.id
            ) > 0,
            (
                SELECT
                    SUM(
                        IF(
                            products_details.available > 0,
                            products_details.available,
                            0
                        )
                    )
                FROM
                    products_details
                WHERE
                    products_details.product_id = products.id
            ),
            0
        )
    ) AS available
FROM
    products

但是,这将非常(!!)慢。我可以以某种方式多次使用相同的子查询吗?所以我可以在 If 语句中使用它,如果它是肯定的,我可以在总和中使用相同的值吗?

这很复杂,但我希望有人能帮助我

/疯子

编辑

我才发现,我可以写

SELECT
    SUM((
        SELECT
            IF(
                SUM(products_details.available) > 0,
                SUM(products_details.available),
                0
            )
        FROM
            products_details
        WHERE
            products_details.product_id = products.id
    )) AS available
FROM
    products

那可以正常工作

编辑2

我找到了一种新的、更快的方法来编写它,而且效果很好:-)

SELECT
    SUM(GREATEST(0,(
        SELECT
            SUM(products_details.available)
        FROM
            products_details
        WHERE
            products_details.product_id = products.id
    ))) AS available
FROM
    products
GROUP BY
    products.id

这非常快 - 从大约 10 秒到略高于 1 秒。

4

1 回答 1

1

子查询不是这项工作的正确工具。事实上,子查询在日常 SQL 查询中相当少见。更可能有用的是JOINs。

SELECT products.*, SUM(IF(product_details.available > 0, product_details.available, 0)) AS available
FROM products
INNER JOIN product_details ON (product_details.product_id = products.id)
GROUP BY products.id

这将为每个产品返回一行,其中包含availability该产品所有行中所有值的总和products_details

于 2012-07-09T12:45:12.487 回答