1
votes

Comment sélectionner tous les auteurs de la base de données avec le nombre de livres qui leur sont attribués?

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.


2 commentaires

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


4 Réponses :


0
votes

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.


0 commentaires

0
votes

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).


0 commentaires

2
votes

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


0 commentaires

0
votes

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;


0 commentaires