J'ai la structure de base de données suivante:
SELECT books.*,authors.* FROM authors FULL OUTER JOIN books ON authors.id = books.authorId;
Je souhaite sélectionner tous les champs des auteurs et le nombre de livres auxquels ils sont affectés. J'ai réussi à obtenir le résultat, mais uniquement pour les auteurs affectés à au moins un livre , ce qui n'est pas ce que je souhaite. J'ai essayé avec la requête suivante:
Authors(id,name); Books(id,title,authorId);
mais cela ne fonctionne pas.
4 Réponses :
La jointure externe
ramènera les auteurs sans livres. À la place, utilisez la jointure interne
et vos résultats ne ramèneront que les auteurs avec au moins 1 livre.
Je recommanderais une sous-requête corrélée:
SELECT a.*, (SELECT COUNT(*) FROM books b WHERE a.id = b.authorId ) as num_books FROM authors;
Cela vous permet d'utiliser SELECT a. *
des auteurs
. Si vous mettez un GROUP BY
dans la requête externe, vous devez soit lister toutes les colonnes séparément, soit utiliser une base de données qui vous permet d'agréger par une clé primaire, tout en sélectionnant d'autres colonnes (c'est standard mais la plupart des bases de données ne le prennent pas en charge).
Je suppose que vous voulez une jointure gauche
et une agrégation:
select a.id, a.name, count(*) from authors a left join books b on b.authorId = a.id group by a.id, a.name
Vous avez certainement besoin de LEFT JOIN et GROUP BY, mais les détails ne sont pas assez clairs dans la description de la tâche. Essayons une sorte de
IFNULL(ab.count, 0) AS count
aussi, si vous ne voulez pas obtenir NULL pour certains auteurs, vous pouvez appliquer une telle expression:
SELECT b.*, ab.count FROM authors AS a LEFT JOIN ( SELECT authorId, COUNT(*) AS count FROM books GROUP BY authorId ) AS ab ON a.id = ab.authorId;
Marquez votre question avec la base de données que vous utilisez. Votre requête ne compte pas, elle ne semble donc pas liée à votre commentaire en gras.
@GordonLinoff 'au moins un' ne nécessite pas de décompte