Re: [LA-discussions] requête mysql |
[ Thread Index | Date Index | More linuxarverne.org/discussions Archives ]
KewlCat a écrit :
KewlCat wrote:jean-luc boutin wrote:neomilium a écrit :Pour plus de clarté je précise en le transposant pour des raisons de confidentialité le contenu de ma base.Le vendredi 22 mai 2009 11:25:08 jean-luc boutin, vous avez écrit :Merci pour vos promptes réponses que je me suis empressé d'essayer.Malheureusement aucune ne fonctionne ou ne donne le résultat escompté.Quelle requête ne donne pas le résultat escompté ? Es tu sûr que ce sont des jointures à gauche qu'il te faut ?Peut-être qu'avec un peu plus de détails sur les tables de départ et le résultat voulu, on pourrait mieux t'aider.Imaginons que je gère des livres pour une bibliothèque de prêt. Je dispose du titre des ouvrages et de différentes appréciations par les lecteurs qui les ont empruntés. Ces appréciations sont par exemple "NUL" "ASSEZ BON" "BON" "TRES BON" "EXCELLENT".La colonne1 contient les titres des ouvrages par exemple: LIvre1 Livre1 Livre1 Livre1 Livre1 Livre2 Livre2 Livre2 Livre2 Livre2 Livre2 Livre3 Livre3 Livre3 ....les titres apparaissent autant de fois qu'ils ont été évalués par les lecteurs. Par exemple le Livre1 a été évalué 4 fois par 4 lecteurs. Supposons que personne ne l'ait trouvé NUL, 1 l'ait trouvé "ASSEZ BON", 2 l'aient trouvé "BON" et 1 "EXCELLENT".Ces valeurs sont mises en face du titre dans une Colonne2 j'ai donc Colonne1 Colonne2 Livre1 Assez Bon Livre1 BON Livre1 BON Livre1 Excellent ....et ainsi de suite pour tous les autres titres. Ce que je veux obtenir c'est un tableau qui m'indique sur la Colonne1 le titre du livre, sur la Colonne2 le nbre de "NUL", sur la Colonne3 le nbre de "Assez bon", sur la Colonne4 le nbre de "Bon", sur la Colonne5 le nbre de "Tres bon" et sur la Colonne6 le nbre de "Excellent" J'ai donc :Colonne1 Col2 Col3 Col4 Col5 Col6 Titre NUL ASSEZ BON BON TRES BON EXCELLENTLivre1 --- 1 2 ---- 1 Livre2 1 3 ---- ---- 1....... etcJ'ai donc créé autant de tables qu'il y a de valeurs à partir de ma base qui comprennent en colonne1 les titres évalués et en colonne2 la valeur . soit NUL pour la table1 "assez bon" pour la table2 "bon" pour la table3 etc.... Bien évidemment certains titres se retrouvent dans toutes les tables d'autres dans certaines tables seulement en fonction des évaluations qui en ont été faites. Il faut donc que dans mon tableau final j'ai dans la colonne1 tous les titres évalués et dans les colonnes 2,3,4,5,6 le nombre d'évaluations correspondantes. J'ai pu faire cela en plusieurs étapes mais pas en une seule requête complexe.--- Liste de discussions de LinuxArverne http://wiki.linuxarverne.org/listes_de_diffusionBonsoir. Est-ce qu'une requête de ce style pourrait te convenir ?SELECT Colonne1, Colonne2, COUNT(1) FROM Table1 GROUP BY Colonne1, Colonne2 ORDER BY Colonne1; Ca te retourne un décompte des différentes associations { Livre ; Note }. Certes, ça ne te listera pas les associations qui n'existent pas, mais logiquement pour construire l'affichage de ton résultat tu vas, à un moment ou à un autre, aller récupérer la liste des différents titres de livres et la liste des différentes notes possibles, et pour remplir ce tableau tu vas aller piocher dans la structure de données (au hasard, un tableau à deux dimensions) qui stocke les notes données et que tu auras préalablement initialisé avec des zéros, non ? ;-) Après, je ne garantis pas d'avoir tout compris, mais pour ce que tu décris ici, cette requête fonctionne.=^.^= --- Liste de discussions de LinuxArverne http://wiki.linuxarverne.org/listes_de_diffusionRebonsoir !En fouillant dans la doc MySQL j'ai trouvé une utilisation détournée de la clause IN qui va bien nous servir :-) En effet, MySQL fait en sorte que la clause IN retourne 0 ou 1 en fonction de la présence d'une valeur dans la liste fournie.Atttention, détournement :SELECT Colonne1, SUM(Colonne2 IN ('NUL')), SUM(Colonne2 IN ('ASSEZ BON')), SUM(Colonne2 IN ('BON')), SUM(Colonne2 IN ('TRES BON')), SUM(Colonne2 IN ('EXCELLENT')) FROM Table1 GROUP BY Colonne1 ORDER BY Colonne1;
Je viens de tester et ça marche avec comme nom de colonne SUM(Colonne2 IN ('ASSEZ BON')) SUM(Colonne2 IN ('BON')) etc.... et des 0 quand il n'y a pas un type d'evaluation correspondant à un titre. C'est ce que je voulais en une seule requête.
Merci mille fois.
Et voilà ! Pas besoin de tableau de valeurs intermédiaire, la requête porte tous les résultats (sauf les valeurs de Colonne2, mais pour cette fois j'ai supposé qu'elles étaient connues et utilisables "en dur"). Dans le cas où les valeurs de Colonne2 ne sont pas connues à l'avance, il faudra faire une première requête à la recherche de DISTINCT Colonne2 puis générer la requête ci-dessus pour ensuite afficher les entêtes de tableau dans l'ordre dans lequel ils auront été récupérés par la seconde requête.=^.^= --- Liste de discussions de LinuxArverne http://wiki.linuxarverne.org/listes_de_diffusion
--- Liste de discussions de LinuxArverne http://wiki.linuxarverne.org/listes_de_diffusion
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |