Mysql 多次使用子查询

Mysql 多次使用子查询,mysql,if-statement,subquery,sum,Mysql,If Statement,Subquery,Sum,我需要一些人帮忙看风景 我有两个表需要“合并”在一起 第一个表包含有关产品的信息(产品颜色尺寸),其他表包含有关niveau产品季节颜色尺寸的库存、销售、可售(数量)等信息 我需要我的观点返回可用的公关产品。 同一产品的颜色大小可以是多次(可以是多个季节),因此我不能只计算可用的ex 我的问题是这样的 SELECT SUM(( SELECT SUM(products_details.available) FROM

我需要一些人帮忙看风景

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

第一个表包含有关产品的信息(产品颜色尺寸),其他表包含有关niveau产品季节颜色尺寸的库存、销售、可售(数量)等信息

我需要我的观点返回可用的公关产品。 同一产品的颜色大小可以是多次(可以是多个季节),因此我不能只计算可用的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 我找到了一种新的、更快捷的方法来编写它,而且效果很好:——)


这是非常快的-从大约10秒到略高于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

这将为每个产品返回一行,其中包含该产品所有
产品的
可用性
值的总和。\u详细信息

这将不起作用。我需要跨季节求和(大小可以是多个季节,但我需要它的求和值)。。我很想(!)使用join(我一直在使用它们),但是因为我需要一种特殊的求和方式,我不能那样使用它啊,我误解了这个限制。您如何确定哪个
产品详细信息
记录是正确的?在你的例子中,一个有6个,一个有-5个,我怎么能判断6是正确的呢?如果我正确地阅读了你的样本,那只是一个将所有负值归零并继续求和的问题。我已经对我的查询进行了调整。我在这里简化了:)子查询中的where语句越多,它就越复杂。这不仅仅是归零。因为,在我检查weither是否为正之前,我需要先对各个季节进行求和。你可能想发布一个真实数据的示例和一个预期输出的示例。如果看不到季节、可用性和产品之间的相互关系,很难猜测查询应该是什么。
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