MySQL子查询/连接

时间:2011-09-26 21:14:00

标签: mysql join subquery

我有两个不同的表格,产品和库存。

基本上,我想要完成的是我需要遍历products表中的每一行并引用inventory表中的相应行。

我的目标是找出哪些产品的数量为0。

库存表每个产品ID都有多行。我面临的问题是,与特定产品相对应的所有库存行需要的数量为0才能使结果对我有用(这就是我想要的弄清楚)

现在,我只是循环遍历每个产品,然后执行第二个SQL语句,检查是否出现任何数量>所选产品的库存表中为0,但这不适用于我的分页脚本(产品表中的20k行,库存表中的更多行。不能同时显示所有产品)

2 个答案:

答案 0 :(得分:1)

您应该在两个表之间预先形成内部联接,然后选择quantity == 0的位置。

类似的东西:

select
    products.*
from
    products
where
    (select sum(inventory.quantity) from inventory where products.id = inventory.productId) = 0

答案 1 :(得分:1)

伪代码

查询变为。

SELECT p.*, SUM(i.qty,0) as number_in_stock
FROM product p
INNER JOIN inventory i ON (i.product_id = p.id)
GROUP BY p.id
HAVING number_in_stock = 0

这会慢得多,因为只有在完成所有加入后才能工作。

如果在qty变为0时从表中删除库存行,则可以执行此查询,这要快得多:

SELECT p.*
FROM product p
LEFT JOIN inventory i ON (i.product_id = p.id)
WHERE i.id IS NULL

左连接在鞋店中执行此操作

product id name           inventory id prod_id qty
------------------        -------------------
        1  shoe                      1 1       10
        2  horse                     We have no horses, all nulls
        3  boot                      2 3       55
        4  ferrari                   go to the cardealer, all nulls

现在我们需要做的就是选择一个字段中null的所有行,这些行的库存通常不是null。 Aha,主键永远不能为空,因此如果我们选择库存PK is null的所有行,我们将拥有不在库存中的产品。