在mysql中正确使用子查询
我的数据库中有这3个表:在mysql中正确使用子查询,sql,join,subquery,Sql,Join,Subquery,我的数据库中有这3个表:产品(id、sku、类型、价格),产品关系(父项id、子项id)和产品库存(产品id、数量、库存)。产品之间可能存在关系:类型X的产品可以是类型Y的多个产品的父产品(可以由多个产品组成)(关系保存在Product\u relation表中)。在DB中,类型X的产品的数量始终设置为0。事情是这样的。我只需要获得库存(in_stock=true)的X型产品(sku和id),并且至少有一个孩子的quantity>0或in_stock=true) 这件事我坚持了好几个小时。我不能
产品(id、sku、类型、价格)
,产品关系(父项id、子项id)
和产品库存(产品id、数量、库存)
。产品之间可能存在关系:类型X的产品可以是类型Y的多个产品的父产品(可以由多个产品组成)(关系保存在Product\u relation
表中)。在DB中,类型X的产品的数量始终设置为0。事情是这样的。我只需要获得库存(in_stock=true
)的X型产品(sku
和id
),并且至少有一个孩子的quantity>0
或in_stock=true
)
这件事我坚持了好几个小时。我不能对此提出一个好的质疑。我取得的最接近的成绩是
SELECT a.`id`, a.`sku` FROM `product` AS a
INNER JOIN `product_stock` AS b
ON a.`id` = b.`product_id`
INNER JOIN `product_relation` AS c
ON c.`child_id` = b.`product_id`
WHERE b.`in_stock` = 1 AND a.`type` = 'X'
但这并不好,因为很多东西都不见了。我不知道这是否只能通过连接或子查询来处理
请帮帮我。我不能完全肯定我理解了你的要求;这有用吗
SELECT a.id, a.sku
FROM product AS a
INNER JOIN product_stock AS b ON a.id = b.product_id
WHERE b.in_stock = 1 AND a.type = 'X'
and exists (
SELECT 'EXISTS'
FROM product d
INNER JOIN product_relation AS c ON c.child_id = d.product_id
WHERE
c.product_id = a.product_id
AND (d.quantity > 0 or d.in_stock = true)
)
我不完全确定我是否理解你的要求;这有用吗
SELECT a.id, a.sku
FROM product AS a
INNER JOIN product_stock AS b ON a.id = b.product_id
WHERE b.in_stock = 1 AND a.type = 'X'
and exists (
SELECT 'EXISTS'
FROM product d
INNER JOIN product_relation AS c ON c.child_id = d.product_id
WHERE
c.product_id = a.product_id
AND (d.quantity > 0 or d.in_stock = true)
)
如果不需要子查询,则不需要它。这里的优点是,如果您想知道哪些子级满足条件,您可以将其字段添加到select子句中
SELECT DISTINCT parent.`id`, parent.`sku`
FROM
`product` parent as parent
INNER JOIN `product_relation` AS c
ON c.`parent_id` = b.`product_id`
INNER JOIN `product_stock` AS parent_stock
ON p.`product_id` = parent_stock.`product_id`
INNER JOIN `product` as child
ON c.`child_id` = child.`product_id`
INNER JOIN `product_stock` AS child_stock
ON c.`product_id` = child_stock.`product_id`
WHERE parent_stock.`in_stock` = 1
and (child_stock.`in_stock` = 1 or child_stock.`quantity`> 0)
and parent.`type` = 'X'
如果不需要子查询,则不需要它。这里的优点是,如果您想知道哪些子级满足条件,您可以将其字段添加到select子句中
SELECT DISTINCT parent.`id`, parent.`sku`
FROM
`product` parent as parent
INNER JOIN `product_relation` AS c
ON c.`parent_id` = b.`product_id`
INNER JOIN `product_stock` AS parent_stock
ON p.`product_id` = parent_stock.`product_id`
INNER JOIN `product` as child
ON c.`child_id` = child.`product_id`
INNER JOIN `product_stock` AS child_stock
ON c.`product_id` = child_stock.`product_id`
WHERE parent_stock.`in_stock` = 1
and (child_stock.`in_stock` = 1 or child_stock.`quantity`> 0)
and parent.`type` = 'X'