2017-06-23 1 views
0

Contexte:MySQL - Comment obtenir la somme des lignes distinctes d'une association hasMany dans une requête de deux associations hasMany?

J'ai trois tables à savoir les productions, les lignes de production et les opérations.

La ligne production_lines fait référence à sa ligne de production précédente avec la colonne 'parent_id'. La profondeur des lignes de production doit être égale aux opérations.

Voici leurs relations:

Production_lines has many (child) production_lines. 
Production_lines belongs to Production. 
Productions has many operations. 

Problème:

Je dois créer une requête de sélection qui utilise le nombre d'opérations et la quantité totale à des fins de sélection. Le problème est que les lignes de production des enfants sont dupliquées à cause de la jonction de la table des opérations. Comment puis-je obtenir la somme de la quantité des lignes de production des enfants de façon distincte?

Solution actuelle:

SELECT 
    `ProductionLine`.`id`, 
    `ProductionLine`.`operation_number`, 
    COUNT(DISTINCT `Production.StockCode.Operations`.id) AS 'numberOfOperations', 
    # This is where the problem is: It sums up including the duplicated entries due to Operations table. 
    SUM(ChildrenProductionLines.dozen_quantity * 12 + ChildrenProductionLines.piece_quantity) AS 'quantityOut' 
FROM 
    `production_lines` AS `ProductionLine` 
LEFT OUTER JOIN `productions` AS `Production` 
    ON `ProductionLine`.`production_id` = `Production`.`id` 
LEFT OUTER JOIN `operations` AS `Production.Operations` 
    ON `Production.Operations`.`production_id` = `Production`.`id` 
LEFT OUTER JOIN `production_lines` AS `ChildrenProductionLines` 
    ON `ProductionLine`.`id` = `ChildrenProductionLines`.`parent_id` 
GROUP BY `ProductionLine`.`id` 
HAVING `operation_number` < `numberOfOperations` 
ORDER BY `id`; 
+0

Essayez de déplacer la 'OUTER JOIN's dans un' WHERE id IN (sous-requête) '. Ou dans un 'JOIN' avec une colonne' GROUP BY' et 'COUNT()' ... –

+0

Au premier test, j'ai été surpris que cela fonctionne. Mais malheureusement, si j'ai essayé deux lignes de production d'enfants ayant la même douzaine de quantième, pièce_quantité, alors elle les traite comme les mêmes et produit des résultats inexacts. – Xegara

+0

La sous-requête est-elle la seule solution? – Xegara

Répondre

0

Essayez quelque chose comme ceci:

SELECT `id`, `operation_number`, `numberOfOperations`, 
     SUM(`dozen_quantity` * 12 + `piece_quantity`) AS `quantityOut` 
FROM `production_lines` 
LEFT JOIN (SELECT `P`.`id`, COUNT(`C`.`id`) AS `numberOfOperations` 
      FROM `productions` AS `P` 
      LEFT JOIN `operations` AS `O` ON `O`.`production_id` = `P`.`id` 
      LEFT JOIN `production_lines` AS `C` ON `P`.`id` = `C`.`parent_id` 
      GROUP BY `P`.`id` 
     ) AS `Q` ON `production_id` = `Q`.`id` 
WHERE `operation_number` < `numberOfOperations` 
ORDER BY `id`; 
+0

On dirait que la sous-requête est vraiment la solution s'il y a au moins deux associations hasMany. Merci! – Xegara