Bonjour à tous.
Je tente de réaliser une requête assez chargée, mais je ne comprends pas où j'ai le bug :
Je vais la détailler pour plus de compréhension :
SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, COM.nbCom, COM.lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE, (SELECT COMD.idFiche, COUNT(COMD.date) as nbCom, MAX(COMD.date) AS lastUpdate FROM l3gr3web_commentaires COMD GROUP BY idFiche) COM WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche = COM.idFiche
Je selectionne les différentes colonnes indiquées. Jusque là, rien de bien difficile. Seulement, une fiche (l3gr3_fiches) n'a pas forcément de commentaire (l3gr3_commentaires). Donc j'ai dut simuler une jointure complète :
SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, "0" AS nbCom, F.date AS lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche NOT IN (SELECT DISTINCT idFiche FROM l3gr3web_commentaires)
Ensuite, je réalise un UNION sur ces deux requetes :
SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, COM.nbCom, COM.lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE, (SELECT COMD.idFiche, COUNT(COMD.date) as nbCom, MAX(COMD.date) AS lastUpdate FROM l3gr3web_commentaires COMD GROUP BY idFiche) COM WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche = COM.idFiche ) UNION ( SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, "0" AS nbCom, F.date AS lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche NOT IN (SELECT DISTINCT idFiche FROM l3gr3web_commentaires) );
Jusque là, tout va bien, la requête marche comme il faut. Cependant, afin de trier les résultats et d'en prendre qu'une partie, j'imbrique le tout dans un "super" select et fait un order by dessus ainsi qu'un LIMIT :
SELECT R.* FROM ( SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, COM.nbCom, COM.lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE, (SELECT COMD.idFiche, COUNT(COMD.date) as nbCom, MAX(COMD.date) AS lastUpdate FROM l3gr3web_commentaires COMD GROUP BY idFiche) COM WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche = COM.idFiche ) UNION ( SELECT F.idFiche, F.date, M.idMembre, M.prenom, M.nom, F.age, F.sexe, CLASSE.niveau, CLASSE.nom AS nomClasse, "0" AS nbCom, F.date AS lastUpdate FROM l3gr3web_fiches F, l3gr3web_membres M, l3gr3web_classes CLASSE WHERE F.idMembre = M.idMembre AND F.idClasse = CLASSE.idClasse AND F.idFiche NOT IN (SELECT DISTINCT idFiche FROM l3gr3web_commentaires) ) R ORDER BY R.nom asc LIMIT 0, 10;
Seulement, Mysql me répond cela :
Erreur 1248 : Every derived table must have its own alias
Alors là, je sèche un peu...
Partager