我几乎没学过MySQL,发现编写查询非常困难,因为变量没有像编写时那样被使用和传递。 JavaScript。
我试图对表中的项目运行“ foreach”循环,然后返回包含子查询中计算结果的表。
在这种情况下,关系数据库中有两个表:
products
,其中包含列product_id
和stock
。
line_items
,其中包含列product_id
和quantity
。
一个product_id
可能会出现几个订单项(查询中有更多字段和更多复杂性,但是我认为这很好地解决了这个问题)。
目标是:
对于每个product.product_id
:
line_items.quantity
product.product_id = line_items.product_id
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)
...
答案 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