0
votes

Comprendre l'utilisation de plusieurs sommes avec les jointures de gauche dans MySQL

Utilisation du groupe par commande, il est possible de rejoindre plusieurs tables et obtenez toujours le nombre de lignes souhaité de la première table.

Par exemple, P>

books
id|title|authorid
1|Huck Finn|1
2|Tom Sawyer|1
3|Python Cookbook|2

orders
id|bookid
1|1
2|1
3|2
4|2
5|3
6|3

authors
id|author
1|Twain
2|Beazley
2|Jones


5 commentaires

Pouvez-vous élaborer sur le "... des sommes correctes"? Veuillez ajouter quelques échantillons de données et le résultat attendu.


Voir l'exemple ci-dessus


Quelle mauvaise idée de l'appeler auteurs.id quand il est pas ID de la table. Ceci est un mauvais modèle de données. Vous devriez avoir une table d'auteurs avec des auteurs uniques et une table de pont pour représenter la relation M: N entre des livres et des auteurs à la place.


S'il vous plaît dans les questions de code donnez un exemple de reproductible minimal - Coupe et code de coller et d'exécution, y compris l'exemple de l'exemple représentatif code; sortie souhaitée et réelle (y compris les messages d'erreur Verbatim); Tags et versions; Spécification claire et explication. Donnez au moins que vous pouvez donner que le code que vous affiche est OK étendu par le code que vous affichez n'est pas correct. (Débogage fondamental.) Pour SQL qui inclut le DBMS & DDL (y compris les contraintes et les index) et l'entrée en tant que code formaté comme une table. S'il vous plaît ne postez pas de code non valide comme une description, cela ne signifie rien. Utilisez des mots pour expliquer la sortie en fonction de l'entrée.


Cela semble probablement une erreur courante dans laquelle les gens veulent des jointures, chacune impliquant éventuellement une clé différente, de certaines sous-requêtes, chacune impliquant éventuellement une jointure et / ou une agrégation, mais essayant à tort de faire toutes les adhésions que tous les agrégats ou agrégés sur les agrégations précédentes. Écrivez des sommes distinctes sur des lignes appropriées et / ou de la somme d'une déclaration de cas cueillette des rangées; Rejoignez sur des ensembles de colonnes uniques communes. Apprenez à ce que le reste rejoindre les retours: Inner Join sur des rangées Union Toutes les rangées de table gauche inégalées sont prolongées par NULLS. Sachez toujours ce que INTERIER JOINT SUR VOUS VOULEZ dans le cadre d'une jointure extérieure.


3 Réponses :


0
votes

Je ne pense pas que votre requête fonctionnerait comme si vous êtes allégué.

suppose qu'un livre pourrait avoir 3 fort> auteurs. p>

pour les auteurs strong>: p>

Donc, vous auriez donc trois rangées strong> pour ce livre dans votre table de livres, chacun pour chaque auteur . p>

donc un p> xxx pré>

vous donne la bonne réponse dans votre cas. p>

pour ordres forts>: p>

Vous devez utiliser un sous-sélection tel que P>

LEFT JOIN (SELECT SUM(id) o_sum,bookid  FROM orders GROUP BY bookid) `o` 
ON o.bookid = b.id 


4 commentaires

Merci. Qui a fait le travail.


@zztop: Mais c'est la seule mauvaise réponse. Votre seule erreur est que vous utilisez somme au lieu de compte .


Je suis désolé Thorsten, je n'ai pas vu votre réponse tant que j'avais déjà marqué cela correctement l'avoir obtenu pour travailler et rafraîchir la page. Vous avez raison qui compte tenu des exemples de données que j'ai utilisés ci-dessus, la SUM ne fonctionnerait pas. Dans les données réelles, il y a beaucoup d'autres colonnes, dont la quantité qui est résumée.


@zztop: Ce n'était pas sur ma réponse. Les forpas ont publié leur réponse beaucoup plus tôt vous disant que vous utilisez à tort somme et que un moyen de traiter les doublons sont des comptes distincts. Mais d'accord, votre exemple était faux donc et c'est en fait d'autres colonnes que vous résumez. Telle peut facilement se produire lorsque vous essayez de simplifier une requête pour Stackoverflow :-)



2
votes

Vous êtes correct qu'en rejoignant plusieurs tables, vous ne recevriez pas les résultats escomptés.
Mais dans ce cas, vous devriez utiliser compter () code> au lieu de somme () code> et compter les commandes ou les auteurs distincts.
Aussi par votre conception, vous devez compter les noms des auteurs et non le ID code> S du tableau auteurs code>: xxx pré>

Voir le Demo .
Résultats: P>

| title           | sales | authors |
| --------------- | ----- | ------- |
| Huck Finn       | 2     | 1       |
| Tom Sawyer      | 2     | 1       |
| Python Cookbook | 2     | 2       |


2 commentaires

Point bien pris sur le compte.


J'espère juste que vous n'utiliserez pas réellement somme () et a.id à compter.



1
votes

Lorsque vous traitez avec des agrégats distincts, il est bon style d'agréger avant de rejoindre.

Votre modèle de données est horriblement déroutant, ce qui semble être écrit par un seul auteur (référencé par books.authorid < / code>), tandis que cet identifiant "id" n'est pas du tout un auteur de l'auteur.

Votre problème principal est: Vous ne comptez pas! Nous comptons avec comptant . Mais vous ajoutez à tort des valeurs d'identifiant avec somme .

Voici une requête appropriée, où je suis agrégé avant de rejoindre et d'utiliser des noms d'alias pour lutter contre la confusion et améliore ainsi la lisibilité de la requête et la maintenabilité. xxx


0 commentaires