MySQL:选择已连接的行,其中子项不属于特定的父项ID

问题描述 投票:0回答:1

这个问题可能听起来有些混乱,我会尽力解释。我有4张桌子:

  • store_item:产品
  • store_cat:产品类别。每个产品有1个类别。
  • store_cat_attribute:类别属性。每个类别都有N个属性。
  • store_item_stock:按属性划分的产品库存

目标是从id表中获取特定产品的所有store_item_stocks,只要store_item_stock.id_attribute与当前的store_item.id_cat无关

这是结构的SQLfiddle:http://sqlfiddle.com/#!9/d686b9/2

我当前的查询实际上获取了产品的所有store_item_stock行,但它还包括属于当前store_item.id_cat的属性:

SELECT store_item_stock.id, store_item_stock.id_attribute, store_item_stock.stock
FROM store_item_stock
LEFT JOIN store_item ON store_item.id_item = store_item_stock.id_item
LEFT JOIN store_cat_attribute ON store_cat_attribute.id_cat = store_item.id_cat
WHERE store_item_stock.id_item = 1 AND store_item.id_cat = 2 GROUP BY store_item_stock.id

例如,id_attribute 2,3和4属于id_cat 2,而id_attribute 33和34属于id_cat 4,所以如果查询的目的是获得所有store_item_stock行除了那些id_attribute链接到store_item.id_cat 2的那些,它应该返回:

  • id:104,id_attribute:33,stock:26
  • id:105,id_attribute:34,stock:28
mysql join left-join right-join
1个回答
1
投票
SELECT store_item_stock.id, store_item_stock.id_attribute, store_item_stock.stock 
FROM store_item_stock 
JOIN store_cat_attribute 
ON store_item_stock.id_attribute=store_cat_attribute.id_attribute
WHERE id_cat NOT IN (
SELECT store_item.id_cat 
FROM store_item JOIN store_cat_attribute 
ON store_item.id_cat=store_cat_attribute.id_cat 
WHERE store_item.id_cat=2 
GROUP BY store_item.id_cat);

我不认为这很简单,但让我们尝试一下,看看条件是否符合你想要的输出。

© www.soinside.com 2019 - 2024. All rights reserved.