J'ai une table principale et une sous-table. La table principale est la liste principale des pièces, la sous-table sont les pièces collectives nécessaires pour la construire. Chaque partie enfant est liée à sa partie parent par le parentid.
La partie ou «enfant» a un enfant enfantine qui pointe son propre entrée à l'intérieur de la liste principale des pièces. Nous utilisons ce lien pour obtenir son prix, comme à l'intérieur de la sous-carte, seul l'ID est stocké. P>
Si je voulais résumer le coût total de toutes ces parties de l'enfant qui composent chaque partie parentale. Comment puis-je structurer cette requête? P>
Le coût total doit être un champ calculé qui sélectionne toutes les pièces de la sous-carte qui ont une pièce parentide == à son identifiant et résume leur prix * P> Voici ce que j'ai jusqu'à présent: p> Exemple: p> Table principale p>
ParentID | ChildID | Name | Qty
1 2 Part2 1
1 3 Part3 2
3 Réponses :
Vous ne devez pas utiliser une clause où la clause d'une jointure gauche provoque-t-elle autrement que cela fonctionne comme une jointure intérieure
Et si vous voulez rejoindre le résultat avec une requête supérieure. Vous devez résumer et grouper par la touche que vous souhaitez être liée à la requête supérieure
la question que vous pouviez directement .. Effectuez une mise à jour basée sur le résultat associé: P > si vous avez juste besoin de sélectionner, alors p> vous pouvez obtenir le résultat dans la requête supérieure à l'aide d'une jointure comme p > select maint.id, ifnull(t.total_x_id ,0)
from main
left join (
SELECT ChildID.ID as ID, SUM(main.PricePer) total_x_id
FROM sub
group by ChildID.ID
) t on t.ID = main.id
C'est proche de travailler, mais cela ne fonctionne pas bien. Et la requête doit être une sélection, pas une mise à jour. La valeur représentée dans la table n'est pas stockée. C'est calculé.
Cela a été très utile! La partie finale de cette question, comment puis-je structurer cela de retourner comme une colonne à côté de la table principale? Cela renvoie la colonne. mais comment puis-je structurer cela pour aligner à côté d'une sélection * sur le principal
OK mais comment vous voulez rejoindre ce réseut à la requête extérieure / supérieure ?? .. le résultat proposé dans ma réponse donne la possibilité de rejoindre le résultat avec une autre requête à l'aide de l'ID ... .. Si vous voulez juste que le total, vous devez filtrer le résultat par l'ID ..Utilisant une clause WHERE basée sur vous Querre supérieure ..
Je voudrais rejoindre les résultats avec la requête supérieure en fonction de l'endroit où.Id = Sub.Parentaid
C'est tellement si proche de travailler. Mais c'est totalement le prix pour la partie principale et tous les sous-parties individuels. Donc, par exemple, dans mon exemple ci-dessus, la partie 3 aurait un montant total de 4, mais la partie 1 aurait un montant total de 0. En d'autres termes. Il sélectionne chaque sous-ligne qui a un enfant == le principal.Id et totalisant cette sélection
Toujours le même. Ceci calculcule le montant total pour toutes les fois où la partie principale est apparue dans d'autres sous-titres de pièces. Donc, une partie de 50 $, qui est apparue dans trois autres sous-titres de pièces, dispose d'un montant total de 150 $ au lieu de 47,82 ou quels que soient les sous-parties auraient ajouté.
Ensuite, vous n'avez pas besoin de la jointure dans la sous-requête. Mais juste un groupe de somme par réponse mise à jour
Nous avons besoin de la sous-requête de jointure pour obtenir le prix des sous-parties. La sous-carte stocke uniquement l'ID. Nous devons aller à la table principale pour obtenir le prix des enfants
Je l'ai compris avec votre aide. J'apprécie le temps que vous avez prêté pour aider.
Voici le choix pour un niveau:
SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper FROM main m1 LEFT JOIN sub s1 ON (m1.id = s1.parentid) LEFT JOIN ( SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper FROM main m2 LEFT JOIN sub s2 ON (m2.id = s2.parentid) LEFT JOIN ( SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper FROM main m3 LEFT JOIN sub s3 ON (m3.id = s3.parentid) LEFT JOIN ( SELECT m4.id, m4.priceper + IFNULL(SUM(s4.qty * g4.priceper),0) AS priceper FROM main m4 LEFT JOIN sub s4 ON (m4.id = s4.parentid) LEFT JOIN main g4 ON (g4.id = s4.childid) GROUP BY m4.id) g3 ON (g3.id = s3.childid) GROUP BY m3.id) g2 ON (g2.id = s2.childid) GROUP BY m2.id) g2 ON (g2.id = s1.childid) -- WHERE m1.id = 1 GROUP BY m1.id;
D'où vient M1?
Mis à jour, Vérifiez maintenant
Très bien, cette requête est bloquée à «Gauche Rejoignez S2 sur (m.Id = s2.parentaid) '- Il ne reconnaît pas M.ID, je ne sais pas pourquoi
Pardon, j'avais tort. J'ai édité mon commentaire, mais vous n'avez peut-être pas vu. C'est la ligne avec M.ID qui est la question qui se déroulait jusqu'à G2 étant un problème.
retourne null :( aussi, où M.ID = 1 devrait devenir quelque chose comme où m.id = s1.parentable afin que nous ayons tout simplement le résultat pour 1. Ceci est beaucoup plus convolué que je ne le pensais pas. ce serait
Je vais vérifier demain.
Appréciez toute l'aide. Merci. Au plaisir de voir le travail demain.
Je l'ai compris. Merci.
Mise à jour de ma réponse. avec des questions plus profondes.
Cela est devenu plus compliqué que je ne pense que cela devait être. Peut-être que c'est ma faute de ne pas le rendre plus clair. Voici la solution que j'ai trouvée qui a fonctionné.
Select *, ifnull((SELECT SUM(main.PricePer * Qty) FROM sub inner join main on sub.ChildID = main.ID where sub.ParentID = main1.PID), 0) from main as main1
Salut! Dans cette solution, vous ne considérez pas les substituts (niveau 2, niveau 3, etc.),
Bonjour, voici quelques liens pour vous aider à structurer votre question: Stackoverflow.com/tags/sql/info meta.stactverflow.com/questions/333952/...
Mettez à jour votre question Ajoutez un échantillon de données approprié et le résultat attendu .. et ajoutez le reste de la requête aussi. (semble que vous utilisez des colonnes liées à la partie extérieure de la requête ... Parentid)
Sub gauche Rejoindre Main semble un peu en arrière.
Mis à jour avec un exemple. Je ne sais pas ce qui est en arrière. Mais je sais que quelque chose ici n'a aucun sens comme je l'ai écrit.
C'est un arbre typique. Avez-vous une limite pour la profondeur de l'arbre? par exemple. partie, sous-partie, substitut, ...? Ou pouvez-vous définir une limite technique pour cela, E.G maximum 5?
sans limites. Une partie peut avoir une sous-pièce, qui présente des sous-parties elle-même, etc.
Dans ce cas, vous ne pouvez pas le résoudre avec une déclaration dans MySQL. Si vous pouviez dire que par ex. La profondeur est maximale 10, puis avec 9 jointures que vous pourriez les attraper. Sinon, vous avez besoin de maintenir une table descendante indirecte (non seulement tenant la dépendance directe, mais jusqu'à la racine, tout), ou si vous avez besoin d'une boucle pour déterminer les dépendances dans une table temporaire, puis résumez tout. Il importe également la complexité de votre structure (la même sous-partie peut être utilisée pour différentes parties principales, etc.)
Et si vous n'avez jamais besoin d'avoir un niveau de profondeur. Parce que chaque partie a un prix stocké dans la table principale? Priceper est différent du totalCost en ce sens qu'il est entré manuellement et stocké au lieu de calculé.
Si vous sélectionnez une partie, vous souhaitez connaître le prix total de cette partie, non? y compris les sous-parties, les sous-plombs, ... La seule chose qui peut vous aider si vous pouvez définir une commande, où les sous-parties peuvent être calculées en premier, puis ses parents, puis ses parents ... etc. Par exemple, si un parent a toujours Un identifiant plus petit que son enfant, si nous commandons par ID desc, nous pouvons traiter d'abord l'arborescence, puis les branches, etc.
Et si nous voulons seulement traiter un niveau de profondeur? Si vous regardez dans mon exemple, les prix sont tous définis. Je voudrais juste que une colonne soit utilisée pour vérifier à peu près que les sous-parties atteignent à peu près la valeur entrée.
Cela n'aide pas. Il est facile de construire une telle requête, mais les descendants ne fonctionneront pas. Je peux l'esquisser comme une réponse, et demain, affinez-le
Même si les descendants (inscriptions sous la table) n'ont-ils besoin d'aucun coût calculé / laminé à afficher?