Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2011, 10h38   #1
Membre régulier
 
Avatar de laloune
 
Inscription : mai 2005
Messages : 178
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 178
Points : 87
Points : 87
Par défaut Transposer une table ?

Bonjour à tous,

je souhaiterais "normaliser" une table, c'est à dire passer les colonnes en lignes. Exemple:

table source:
id | Colonne 1 | Colonne 2 | Colonne 3 | ... | Colonne n
1 | blabla1 | toto1 | titi1 | tata1 | ... | tete1
2 | blabla2 | toto2 | titi2 | tata2 | ... | tete2
3 | blabla3 | toto3 | titi3 | tata3 | ... | tete3

table cible:
id | Champ normalisé | Valeur
1 | Colonne 1 | blabla1
1 | Colonne 2 | titi1
1 | Colonne 3 | tata1
1 | Colonne 4 | tete1
2 | Colonne 1 | blabla2
2 | Colonne 2 | titi2
2 | Colonne 3 | tata2
2 | Colonne 4 | tete2

j'ai cherché sur Google et j'ai trouvé la solution du union. dans l'exemple ci-dessus ca donnerait:

Code :
1
2
3
4
SELECT id, Colonne 1 AS Champ normalisé FROM TABLE
UNION
SELECT id, Colonne 2 FROM TABLE
-- etc.
par contre dans la mesure où je ne connais pas d'avance le nombre de colonnes de la table, je doute que cela soit possible d'utiliser cette méthode...

une idée ?

Merci par avance!
__________________
laloune
éternel apprenti développeur (pas de formation)

"C'est le jeu ma pauvre Lucette"
laloune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 11h47   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

tu peux utiliser un script php par exemple te retournant les colonnes de ta table :

Code php :
1
2
3
4
5
6
7
8
 
$table = 'unNomDetable';
$tab = array();
 
$result= mysql_query('describe ' .$mytable);
 
while ($row = mysql_fetch_assoc($result))
    $tab[] = $row['Field'];

En sortie de boucle, le tableau $tab contient donc la liste de tes champs, reste plus qu'a générer un UNION dynamique avec
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 17h00   #3
Membre régulier
 
Avatar de laloune
 
Inscription : mai 2005
Messages : 178
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 178
Points : 87
Points : 87
Bonjour Madfrix,

merci pour ta réponse,

en fait j'aurais besoin d'une solution pur SQL dans la mesure où j'utilise un ETL pour lancer ma requête sur la base MySQL.

s'il n'y a pas de solution pur SQL je passerai effectivement par du code (mais c'est moins bien pour des raisons de performances)

A+
__________________
laloune
éternel apprenti développeur (pas de formation)

"C'est le jeu ma pauvre Lucette"
laloune est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 17h47   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Alors désolé je vois pas comment faire cela sinon

Peut être via une procédure stockée...
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 09h55   #5
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonjour,

Citation:
Envoyé par laloune Voir le message
s'il n'y a pas de solution pur SQL je passerai effectivement par du code (mais c'est moins bien pour des raisons de performances)
Il faut se méfier de ce genre d'apriori.
Il y a des tas de choses qu'une base de données SQL fera toujours de manière beaucoup moins efficace qu'un programme ad-hoc.

De manière générale, le SQL est sensé être efficace pour tous ce qui retourne d'une logique relationnelle.
Là on est typiquement dans un besoin qui sort de cette logique et pour lequel il faudra faire de la gymnastique pour parvenir à trouver une solution SQL.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 18h38   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Citation:
Envoyé par laloune Voir le message
par contre dans la mesure où je ne connais pas d'avance le nombre de colonnes de la table, je doute que cela soit possible d'utiliser cette méthode...
Si tu ne connais pas les colonnes à l'avance, alors ce n'est pas possible par le biais d'une requête de ce type.
Il faut, éventuellement, essayer de passer par des fonctions utilisateurs, mais MySQL n'est pas très avancé en la matière.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 23h27   #7
Membre régulier
 
Avatar de laloune
 
Inscription : mai 2005
Messages : 178
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 178
Points : 87
Points : 87
ok merci beaucoup, je vais chercher par là.
__________________
laloune
éternel apprenti développeur (pas de formation)

"C'est le jeu ma pauvre Lucette"
laloune est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h59.


 
 
 
 
Partenaires

Hébergement Web