多次使用子查询

时间:2012-07-09 12:37:23

标签: mysql if-statement subquery sum

我需要一些观点的帮助。

我有两张表需要“合并”在一起。

第一张表包含有关产品的信息(产品颜色大小),其他表格包含有关产品 - 季节颜色大小niveau的库存,销售,可用量(数量)等信息。

我需要我的观点才能返回可用的pr产品。 相同的产品颜色大小可以是多次(可以是多个季节),因此我不能仅仅提供前款。

我的查询看起来像这样

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语句中使用它,如果它是正数,我可以在总和中使用相同的值吗?

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

/的Mads

修改

我刚刚发现,我可以写

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

那可以正常工作

EDIT2

我找到了一种新的,更快捷的方法来编写它,它的工作正常: - )

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秒。

1 个答案:

答案 0 :(得分:1)

子查询不适合这项工作。事实上,子查询在日常SQL查询中相当罕见。更有可能的是JOIN s。

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值的总和。