2011-01-14 8 views
0

J'ai 3 tables dans ma base de données: product (id, sku, type, price), product_relation (parent_id, child_id) et product_stock (product_id, quantity, in_stock). Il existe des relations possibles entre les produits: Le produit de type X peut être un parent (peut se composer de) à plusieurs produits de type Y (relation conservée dans le tableau product_relation). Dans les produits DB de type X, la quantité est toujours définie sur 0. Maintenant, voici la chose. Je dois obtenir seulement des produits (sku et id) de type X qui sont en stock (in_stock = true) et au moins un de leurs enfants a quantity > 0 ou in_stock = true.utilisation correcte des sous-requêtes avec mysql

Je suis coincé là-dessus pendant plusieurs heures. Je ne peux pas faire une bonne requête pour cela. Le plus proche que j'ai atteint est


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' 

mais ce n'est pas bon, car de nombreux éléments manquent. Je ne sais pas si cela peut être manipulé par des jointures seulement ou des sous-requêtes ont Aide s'il vous plaît.

Répondre

3

Je ne suis pas totalement sûr d'avoir compris ce que vous demandiez; est-ce que cela aide?

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

Vous n'avez pas besoin d'une sous-requête si vous ne le souhaitez pas. L'avantage ici est que si vous voulez savoir quels enfants répondent aux critères, vous pouvez simplement ajouter ses champs à la clause 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'