在主查询中使用子查询中的值

时间:2019-04-18 22:14:24

标签: mysql

我几乎没学过MySQL,发现编写查询非常困难,因为变量没有像编写时那样被使用和传递。 JavaScript。

我试图对表中的项目运行“ foreach”循环,然后返回包含子查询中计算结果的表。

在这种情况下,关系数据库中有两个表:

products,其中包含列product_idstock

line_items,其中包含列product_idquantity

一个product_id可能会出现几个订单项(查询中有更多字段和更多复杂性,但是我认为这很好地解决了这个问题)。

目标是:

对于每个product.product_id

  1. line_items.quantity
  2. 的项目进行总计product.product_id = line_items.product_id
  3. 如果product.stock - sum > 0,则返回包含product.product_id, product.stock - sum的行。

我的查询如下:

SELECT products.product_id, products.stock
    FROM products
        WHERE
        products.stock - (
        SELECT SUM(line_items.quantity)
            FROM line_items
            WHERE line_items.product_id = products.product_id
        ) > 0

问题是,我似乎无法弄清楚如何进行逻辑检查(x > 0 ?),如果它是正确的,请在主查询中使用该值。最终产生这样的东西:

SELECT products.product_id, (products.stock - sum) ...

1 个答案:

答案 0 :(得分:0)

您可以将子查询移至主要的SELECT中,然后使用HAVING子句来过滤值(您不能在WHERE子句中使用别名再次像在原始查询中一样写出整个表达式):

SELECT products.product_id, 
       products.stock - (SELECT SUM(line_items.quantity)
                         FROM line_items
                         WHERE line_items.product_id = products.product_id
                        ) AS stock_on_hand
FROM products
HAVING stock_on_hand > 0

将其写为JOIN查询可能更有效:

SELECT p.product_id, 
       p.stock - l.quantity AS stock_on_hand
FROM products p
JOIN (SELECT product_id, SUM(quantity) AS quantity
      FROM line_items
      GROUP BY product_id) l ON l.product_id = p.product_id
HAVING stock_on_hand > 0

Demo on dbfiddle