2 votes

Condition SQL max dans une double jointure

Nous disposons donc de trois tableaux pertinents :

  • book avec des attributs title, numberofpages
  • person avec last name et id
  • writes avec author (= person.id ) et book (= book.title )

Nous voulons donc trouver le nom de famille de chaque personne qui est un auteur et le nombre de pages de son livre avec le numéro de page le plus élevé.

Nous avons essayé ceci :

SELECT lastname, numberofpages
FROM book, person, writes 
WHERE person.id=writes.author AND book.title=writes.book

ce retour :

author A  number of pages of his book 1
author A  number of pages of his book 2
author B  number of pages of his book 1  

et ainsi de suite...

Comment faire pour qu'il n'y ait qu'une ligne par auteur qui ne contienne que le nombre de pages du livre ayant le numéro le plus élevé ? Nous avons essayé toutes sortes de sous-sélections avec max(numberofpages) mais n'arrive pas à le faire fonctionner.

2voto

dasblinkenlight Points 264350

Vous devez faire des regroupements par auteur, et choisir les max :

SELECT person.lastname, max(book.numberofpages)
FROM book, person, writes 
WHERE person.id=writes.author AND book.title=writes.book
GROUP BY person.lastname, person.id

Vous devriez également envisager d'utiliser une syntaxe de jointure moderne et de conserver les informations sur les auteurs ayant des identifiants différents mais le même nom de famille :

SELECT person.lastname, max(book.numberofpages)
FROM book
JOIN writes ON book.title=writes.book
JOIN person ON person.id=writes.author
GROUP BY person.id, person.lastname

2voto

aF. Points 15815

Vous devez utiliser le group by clause comme celle-ci :

select p.lastname, max(w.numberofpages)
from writes w
inner join person p on p.id = w.author
inner join books b on b.title = w.book
group by p.lastname, p.id

0voto

Losbear Points 1045

Vous devrez utiliser GROUP BY :

SELECT person.lastname, max(writes.numberofpages)
FROM book, person, writes  
WHERE person.id=writes.author AND book.title=writes.book 
GROUP BY person.lastname, person.id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X