Effectivement il y'a des petites erreurs, le champ commande_id doit être préfixé par le nom de la table d'origine exemple : commande.commande_id ou contient.commande_id car ce champ existe dans les deux tables.
même remarque pour le champ produit_id qui existe à la fois dans "contient" et "produit".
Je t'explique le fonctionnement de sa requête:
select commande.commande_id, avion_id, commande_date, produit.produit_id, SUM(produit_quantite)
Permet de définir les champs à retourner par la requête et dont on a besoin pour les traitements
from (commande JOIN contient ON commande.commande_id=contient.commande_id) JOIN produit ON contient.produit_id=produit.produit_id
Pour définir les tables utilisées et leurs jointures
where commande_date >= '".$date_debut."'
and commande_date <= '".$date_fin."'
Pour définir les critères de sélection
order by produit.produit_id desc
Pour définir un tri de sortie
Seulement je ne suis pas pour cette requête
le mieu est d'utiliser un GROUP BY (regroupement) au lieu d'un ORDER BY (tri) car le select effectue une somme (SUM) des quantités et chose importante, il n'est pas utile d'afficher les détails d'info tel que les infos sur les commandes puisque le traitement voulu s'oriente vers la gestion de stock (la somme des quantités sorties par produit)
Dans ce sens je te préconise cette requête :
SELECT produit.produit_id, produit_designation, SUM(produit_quantite) as quantité_sortie
FROM (commande JOIN contient ON commande.commande_id=contient.commande_id) JOIN produit ON contient.produit_id=produit.produit_id
WHERE commande_date >= '".$date_debut."'
and commande_date <= '".$date_fin."'
GROUP BY produit.produit_id, produit_designation