Re: [LA-discussions] requête mysql

[ Thread Index | Date Index | More linuxarverne.org/discussions Archives ]


KewlCat wrote:
jean-luc boutin wrote:
neomilium a écrit :
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.

Pour plus de clarté je précise en le transposant pour des raisons de confidentialité le contenu de ma base.

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 EXCELLENT

Livre1 --- 1 2 ---- 1 Livre2 1 3 ---- ---- 1
.......
etc

J'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_diffusion

Bonsoir.

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_diffusion

Rebonsoir !

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;

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


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/