我需要一些观点的帮助。
我有两张表需要“合并”在一起。
第一张表包含有关产品的信息(产品颜色大小),其他表格包含有关产品 - 季节颜色大小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
那可以正常工作
我找到了一种新的,更快捷的方法来编写它,它的工作正常: - )
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秒。
答案 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
值的总和。