|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
Bonjour à tous,
J'ai un problème simple et classique, mais dont je ne trouve pas la solution. Il s'agit d'un projet scientifique à vocation statistique et visant une certaine souplesse d'exploitation, ce qui explique que je stocke mes données de manière peu orthodoxe. Pour faire court, j'ai une table data de type : Code :
et je veux créer une requête me permettant de "recolonniser" (dsl) les données en tableau de type "excel", comme suit : Code :
Code :
J'ai songé aux RIGHT OUTER JOIN, et à utiliser des conditions (IF (id_var = '1', value, ''), mais ça répond pas au problème. Je cherche encore mais si l'un d'entre vous connaît la solution ou est prêt à donner une piste, je suis preneur... Merci d'avance et bonne journée, ==> Je précise : je suis sous MySQL 5.0. |
||||||
|
|
00
|
|
|
#2 |
![]() ![]() |
Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBD mais celui du programme qui présente les données à l'utilisateur. Tu as d'ailleurs découvert toi-même les limites de ce bricolage qui s'avère irréaliste au delà de quelques valeurs !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
Bonjour,
sous MySql vous avez une fonction group_concat qui correspond à peu prés à votre demande. sinon ce que vous essayez de faire n'étant pas vraiment orthodoxe c'est normale que mysql ait du mal. Ceci devrait être géré par un programme qui génère votre rapport. |
|
|
00
|
|
|
#4 |
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
Merci pour vos réponses éclairs.
Effectivement, j'aurais dû préciser que la programmation (php) était la voie initiale et privilégiée pour résoudre à ce problème. Problème : là aussi, ça patine et j'ai des soucis de mémoire : le script bouffe 135 Mo et je n'ai pas encore mis la main sur le bon paramètre pour élargir la mémoire (alors que le memory_limit est de 256 Mo dans php.ini). Par conséquent, comme on me demande à titre urgent les données provisoires sous format csv, j'essaie de passer par une requête manuelle exécutée sous phpMyAdmin. J'ai aussi songé à GROUP_CONCAT, mais comme toutes les variables ne sont pas renseignées (et dans le désordre), je risque d'avoir de sérieux décalages. edit : Woops, il bouffe 134217728 bytes, i.e. 128 Mo. Pourtant, j'ai modifié le plafond... |
|
|
00
|
|
|
#5 | ||
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Bonjour,
Essayez avec un CASE : Code :
|
||
|
|
00
|
|
|
#6 | |||
![]() ![]() |
Citation:
Citation:
Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|||
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
@CinePhil
Le script stocke dans un tableau toutes les données sous forme d'objets (objet de classe variable, objet de classe individu, objet de classe data). C'est lui qui bouffe tout. Par ailleurs, ayant conçu le système, je suis engagé sur le résultat. Ça fonctionnait bien avec quelques centaines d'individu sur 50 variables. C'est mon premier "gros" projet. J'optimise au fur et à mesure. @Snipah Je viens d'essayer CASE à l'arrache. Ça pourrait peut-être fonctionner. Je creuse ça en début d'apm. Merci ! |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 641 ![]() |
Si vous ramenez toute votre BDD en mémoire via des objets c'est sur que ça va prendre des ressources.
Là vous essayez de faire un csv (ou xls), pourquoi ne pas le générer directement avec la sortie de votre requête sql ? Si elle est ordonnée ca devrait être assez simple de traiter ligne par ligne le résultat. |
|
|
00
|
|
|
#9 | ||||
![]() ![]() |
Si c'est seulement l'id_individu qui vous intéresse, ramenez toute votre table data ordonnée par individu et par variable dans un tableau PHP puis gérez les ruptures de personnes et de variables dans la présentation des données. C'est assez classique à faire en PHP et avec 50 000 lignes, ça ne devrait pas poser de gros problèmes.
Si vous voulez le nom des individus et le nom des variables, voire d'autres infos complémentaires, faites une jointure de votre table data avec les tables individus et variables. Code :
Code :
Ensuite, dans une boucle parcourant le tableau issu de la première requête, vous gérer les changement d'individus pour construire les lignes et, à l'intérieur de chaque ligne, vous comparez la liste des variables de l'individu à la liste de toutes les variables pour gérer l'affichage de la valeur ou rien si la variable n'a pas de valeur pour l'individu considéré. Mais tout ceci est plutôt à voir dans le forum PHP.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||
|
00
|
|
|
#10 | ||||
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
Bon, l'opérateur CASE ne convient pas. Comme je commence tout juste les opérateurs SQL, je crois comprendre que c'est logique : après le premier cas positif, il sort de la boucle. Par conséquent, j'ai toujours une colonne renseignée, mais les deux autres (sur un test avec trois colonnes) sont systématiquement nulles.
Voici ce que j'ai essayé : Code :
Code :
Le problème, c'est GROUP BY. Il ne remplace pas les champs NULL par les champs non NULL ; il ne fait que conserver la première ligne... C'est bête, ça... @CinePhil Effectivement, je crois que ça va se terminer comme ça, avec un traitement php d'une requête. Je perds pas mal de fonctions dans l'affaire (contrôle et versions multiples des mêmes données), mais j'essaierai de rectifier avec le temps. |
||||
|
|
00
|
|
|
#11 |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Parce que vous avez enlevé les max, regardez à nouveau mon exemple, vous devriez obtenir ce que vous voulez.
Edit : d'ailleurs un autre SGBD que MySQL vous aurait interdit de faire une telle requête. Du coup il ne conserve qu'une ligne "au hasard", donc forcément pour chaque id_individu une seul variable est renseignée. |
|
|
00
|
|
|
#12 |
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
HouUUUUuu pinaise !
Merci Snipah ! J'avais bien mis le max() au début, mais il se plaignait de ne pas trouver la fonction. J'avais donc laissé tomber et retirer la fonction, ce qui semblait encore... fonctionner. Avec MAX en majuscule, ça marche ! Et je comprends maintenant l'utilité de MAX() : si supérieur ou différent de NULL, alors je garde. Sinon, je jette. Hurrah !! Parce qu'autrement, même en passant par un simple tableau php pour traiter une requête SQL "en ligne", toute ma mémoire y passe... ! |
|
|
00
|
|
|
#13 | |
|
Membre émérite
![]() Inscription : août 2008 Messages : 835 ![]() |
Citation:
Si vous avez un peu de temps pour vous renseigner, vous pouvez lire par exemple le cours de sqlpro : http://sqlpro.developpez.com/cours/sqlaz/ensembles/ |
|
|
|
00
|
|
|
#14 |
|
Membre à l'essai
![]() Inscription : novembre 2009 Messages : 91 ![]() |
Je découvre en effet pas mal de choses. C'est bon pour la suite.
Merci encore ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com