2011-01-14 2 views
0

DB에 3 개의 테이블이 있습니다 : product (id, sku, type, price), product_relation (parent_id, child_id)product_stock (product_id, quantity, in_stock)입니다. 제품간에 가능한 관계가 있습니다. 유형 X의 제품은 유형 Y (관계가 product_relation 테이블에 보관 된)의 여러 제품에 대한 상위 (구성 가능) 일 수 있습니다. 유형 X의 DB 제품에는 항상 수량이 0으로 설정되어 있습니다. 이제 여기가 있습니다. 재고 있음 (in_stock = true)이며 최소 하나의 자녀가 quantity > 0 또는 in_stock = true 인 X 유형의 제품 (skuid) 만 받아야합니다.mysql을 이용한 서브 쿼리의 올바른 사용

나는 몇 시간 동안 붙어 있습니다. 나는 이것을 위해 좋은 질의를 할 수 없다. 내가 얻은 가장 가까운 것 하나는


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' 

입니다.하지만 많은 항목이 없기 때문에 좋지 않습니다. 조인만으로 처리 할 수 ​​있는지 또는 서브 쿼리가 도와 주는지 잘 모르겠습니다.

답변

3

나는 당신이 묻고있는 것이 무엇인지 이해하지 못했습니다. 이게 도움이 되니?

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) 

) 
0

원하지 않는 경우 하위 쿼리가 필요하지 않습니다. 장점은 어떤 아이들이 기준을 충족하는지 알고 싶다면 필드를 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' 
관련 문제