OVH Cloud OVH Cloud

[MySQL] enregistrements = champs

7 réponses
Avatar
Denis Bitouzé
Bonjour,

j'ai une table nomm=E9e Table1 contenant plusieurs enregistrements
provenant d'un fichier nomm=E9 Fichier1.txt charg=E9 par la commande LOAD
DATA. Je souhaiterais que les enregistrements d'une colonne (nomm=E9e
Colonne1) de cette table deviennent les champs d'une autre table nomm=E9e
Table2.

Quelle(s) commande(s) peut-on employer pour r=E9aliser cela, si possible
=E0 partir de la table Table1 (ce serait le mieux), sinon =E0 partir du
fichier Fichier1.txt =E9ventuellement modifi=E9 ?

Merci d'avance,
--=20
Denis.

7 réponses

Avatar
Thibaut Allender
on 8/04/2004 20:15, Denis Bitouzé wrote :

j'ai une table nommée Table1 contenant plusieurs enregistrements
provenant d'un fichier nommé Fichier1.txt chargé par la commande LOAD
DATA. Je souhaiterais que les enregistrements d'une colonne (nommée
Colonne1) de cette table deviennent les champs d'une autre table nommée
Table2.

Quelle(s) commande(s) peut-on employer pour réaliser cela, si possible
à partir de la table Table1 (ce serait le mieux), sinon à partir du
fichier Fichier1.txt éventuellement modifié ?



insert into table2 (colonne_voulue) select colonne1 from table1;

--
thibaut allender | freelance | web|system developer|designer
+32 496 26 75 76 | http://capsule.org
Avatar
Denis Bitouzé
Le Thu, 08 Apr 2004 19:01:08 +0200
Thibaut Allender
a écrit:

on 8/04/2004 20:15, Denis Bitouzé wrote :

> j'ai une table nommée Table1 contenant plusieurs enregistrements
> provenant d'un fichier nommé Fichier1.txt chargé par la commande
> LOAD DATA. Je souhaiterais que les enregistrements d'une colonne
> (nommée Colonne1) de cette table deviennent les champs d'une autre
> table nommée Table2.

insert into table2 (colonne_voulue) select colonne1 from table1;



Euh, j'ai dû mal m'expliquer : la solution que tu proposes recopie les
enregistrements de la colonne Colonne1 de la table Table1 dans la
colonne colonne_voulue de la table Table2.

Ce que je voudrais, c'est que les enregistrements de la colonne
Colonne1 de la table Table1 deviennent des CHAMPS de la table Table2.
Plus précisément, si j'ai ceci

SELECT Colonne1 FROM Table1;

Colonne1
----------
Data1
Data2
.
.
.
Datan

et cela :

SELECT * FROM Table2;

id
----------
1
2
.
.
.
m

(Table2 n'a qu'une seule colonne au départ) je voudrais, après
exécution de la commande magique que je cherche, obtenir cela :

SELECT * FROM Table2;

id Data1 Data2 ... Datan
----------------------------
1
2
.
.
.
m

Merci !
--
Denis.
Avatar
Denis Bitouzé
Le Thu, 08 Apr 2004 19:50:44 +0200
Thibaut Allender
a écrit:

on 8/04/2004 21:30, Denis Bitouzé wrote :

> Ce que je voudrais, c'est que les enregistrements de la colonne
> Colonne1 de la table Table1 deviennent des CHAMPS de la table
> Table2.

ah ok... en sql je vois pas
le plus simple est de faire une macro dans un editeur texte, qui va
te constituer les ALTER TABLE ad hoc



Oui, j'avais songé à cette solution en dernier recours mais, mais...
relativement débutant en SGBDR, si sql ne permet pas une telle chose,
j'en viens à demander si le schéma que je compte adopter est
judicieux...

Il est le suivant : enseignant de mathématiques, je dois me farcir la
corvée peu réjouissante de la correction de mes copies. Pour faciliter
le décompte des points, j'ai l'habitude de réaliser dans un tableur
une grille de correction. Cette grille contient, en ligne les
étudiants et, en colonnes, chacune des questions sauf :

-- la première ligne qui contient le nombre de points affecté à
chaque question ;
-- la première colonne qui contient la note de chaque étudiant.

Dans chacune des cellules, j'indique le pourcentage de réussite de
l'étudiant à la question. Le calcul automatique de la note de
chaque étudiant s'effectue par somme des produits des pourcentages de
sa ligne et de la ligne des points. En résumé, on a par exemple cela
(« Q » comme « question », « pts » comme « points ») :

|----------|------||-----|-----|-----|-----|
| Étudiant | Note || Q 1 | Q 2 | ... | Q n |
|----------|------||-----|-----|-----|-----|
|//////////| pts || 2 | 1,5 | ... | 4,5 |
|==========|======||=====|== ===|=====|=====|
| Nom 1 | 12 || 10% | 50% | ... | 100%|
|----------|------||-----|-----|-----|-----|
| Nom 2 | 16 || 70% | 40% | ... | 50% |
|----------|------||-----|-----|-----|-----|
| ...... | ... || ... | ... | ... | ... |
|----------|------||-----|-----|-----|-----|
| Nom m | 8 || 70% | 25% | ... | 0% |
|----------|------||-----|-----|-----|-----|

Pour adapter cela à un système de base de données, j'envisage donc de
créer :

1) une première table (Table1 disons) à deux champs :

a) intitulés des questions (clé primaire);
b) points affectés à chaque question.

Celle-ci contient donc les enregistrements suivants :

SELECT * FROM Table1;

intitule pts
---------------
Q1 2
Q2 1,5
.
.
.
Qm 4,5

2) une deuxième table (disons Table2) contenant comme champs :

a) id des étudiants ;
b) les intitulés des questions.

Celle-ci contient donc les enregistrements suivants :

SELECT * FROM Table2;

id Q1 Q2 ... Qn
----------------------------
1 10 50 ... 100
2 70 40 ... 50
.
.
.
m 70 25 ... 0


Les calculs des notes seront effectués par ailleurs.


Si vous voyez un défaut dans ce modèle, je vous remercie à l'avance de
bien vouloir me l'indiquer.
--
Denis.
Avatar
Denis Bitouzé
Le Sat, 10 Apr 2004 12:20:03 +0200
Paul Delannoy a écrit:

SI c'est saisi dans un tableur, tu peux faire une transposition avant
d'exporter vers MySql, non ?..



Certes, mais je voudrais abandonner le recours au tableur et ne plus
passer que par :

1) MySQL pour le stockage des données (intitulés des
questions, points affectés aux questions, noms des étudiants,
pourcentage de réussite aux questions) ;
2) un script (en python par exemple) pour les calculs.

L'idée est de créer une interface Web à la chose (via Zope par
exemple).

--
Denis.
Avatar
Denis Bitouzé
Le Fri, 09 Apr 2004 11:22:41 +0200
Thibaut Allender
a écrit:

non, ca semble etre un bon systeme,



Aaaahhhh... Merci !

mais pourquoiu vouloir a tout
prix rendre les champs de Table2 dynamiques ?



Je ne suis pas sûr de comprendre le sens du terme « dynamique » ici.
J'ai omis de préciser que, pour que les étudiants puissent connaître
exactement leur (pourcentage de) réussite à chaque question, il faut
que les champs reprennent explicitement les intitulés des questions de
l'épreuve de math, intitulés qui changent à chaque épreuve. On pour rait
certes imaginer un table par épreuve de la forme suivante :

id_intitule intitule_exact pts
---------------------------------
Q1 I.1 2
Q2 I.2 3,5
.
.
.
Qn IV.3 4

et une table de correction associée à cette épreuve de la forme :

id_etudiant Q1 Q2 ... Qn
-----------------------------
1 10 50 ... 100
2 70 40 ... 50
.
.
.
m 70 25 ... 0

Le problème est que, bien sûr, le nombre de questions est variable
d'une épreuve à l'autre. On pourrait alors certes imaginer d'adapter ce
qui précède en, pour une épreuve donnée :

id_intitule intitule_exact pts
---------------------------------
Q1 I.1 2
Q2 I.2 3,5
.
.
.
Qk IV.3 4
Qk+1
.
.
.
Qn

et une table de correction pour cette épreuve de la forme suivante,
issue d'une table générique de correction :

id_etudiant Q1 Q2 ... Qk Qk+1 ... Qn
--------------------------------------------
1 10 50 ... 100
2 70 40 ... 50
.
.
.
m 70 25 ... 0

Mais, si le nombre maximal de questions (n), venait à être dépassé pour
une épreuve donnée (dans certains concours, il y en a plus de 100 !),
ça poserait un problème non négligeable...

On peut tres bien imaginer avoir une table generique avec 50
question, et n'en utiliser qu'une partie lors du remplissage



C'est vrai, mais le jour où il y en a davantage, on est coincé. En
fait, j'aimerais ensuite mettre à dispositions de collègues ce système
de notes et alors ce genre de limitation peut être gênant. Bon, OK, je
peux prévoir 1000 questions, là, je devrais être tranquille ;)

il serait egalement interessant de pouvoir introduire un ID de
questionnaire, dans les 2 tables

Table1 cotniendrait alors :
id_questionnaire | intitule | pts

et Table 2 :
id_questionnaire | id_etudiant | Q1 | Q2 | Qn

on obtient donc une structure qui peut accueillir plusieurs
questionnaires, et surtout independante du nombre de questions



C'est en effet une piste intéressante à laquelle je n'avais pas songé.
Mais, pour les deux tables, si j'ai bien compris, les identifiants sont
à chaque fois composites :

-- (id_questionnaire,intitule) pour Table1 ;
-- (id_questionnaire,id_etudiant) pour Table2.

Et il me semble avoir lu à plusieurs reprises que les identifiants
composites peuvent poser des problèmes de performance (bien sûr, je ne
vais pas non plus stocker des millions de données ;) et de
complications des manipulations par SQL.

Par ailleurs, s'il est vrai qu'on n'est plus tributaire du nombre de
questions, on reste tributaire du nombre >maximum< de questions, non ?

En tous cas, merci pour ces idées !
--
Denis.
Avatar
Denis Bitouzé
Le Fri, 09 Apr 2004 14:54:14 +0200
Thibaut Allender
a écrit:

on 9/04/2004 16:29, Denis Bitouzé wrote :

> On pourrait certes imaginer un table par
> épreuve de la forme suivante :

ca qui veut dire une nouvelle table par epreuve... c'est pas vraiment
l'ideal si on veut travailler avec des bases



Euh, excuse-moi, peux-tu préciser ? Je ne vois pas pourquoi...

> id_intitule intitule_exact pts
> ---------------------------------
> Q1 I.1 2

> et une table de correction associée à cette épreuve de la forme :
>
> id_etudiant Q1 Q2 ... Qn
> -----------------------------
> 1 10 50 ... 100
> 2 70 40 ... 50

oui, c'est mieux de proceder de cette facon
avoir une structure fixe, et des données variables (evidemment ;)



OK.

il vaut mieux prevoir une table contenant suffisamment de colonnes
"questions", mais simplifiant grandement le systeme, que d'imaginer
une usine a gaz, qui au final ne servirait qu'une seule fois par an
parce qu'une epreuve a 101 questions au lieu des 100 prevues...

prevois 100 questions... si un jour il en faut plus, il est facile de
rajouter des colonnes



D'accord, tu m'as convaincu, en particulier par la précision « usine à
gaz ». Je cherchais une solution simple (et, si possible, élégante)
pour réaliser mon objectif, pensant qu'elle existait avec MySQL.
Puisque tel ne semble pas être le cas, je vais m'orienter vers un autre
objectif, certes moins ambitieux, mais ne nécessitant pas une usine à
gaz, avec toutes les exceptions à envisager...

ca depend comme seront traitees les données
a priori ca ne devrait pas poser de probleme



OK.

> Par ailleurs, s'il est vrai qu'on n'est plus tributaire du nombre
> de questions, on reste tributaire du nombre >maximum< de questions,
> non ?

oui, il faut determiner un maximum qui ne sera jamais atteint



OK.

(un peu comme quand on determine la taille d'un varchar)



En effet !

Merci encore...
--
Denis.
Avatar
Denis Bitouzé
Le Fri, 09 Apr 2004 15:57:02 +0200
Thibaut Allender
a écrit:

on 9/04/2004 17:26, Denis Bitouzé wrote :

>>ca qui veut dire une nouvelle table par epreuve... c'est pas
>vraiment>l'ideal si on veut travailler avec des bases
>
> Euh, excuse-moi, peux-tu préciser ? Je ne vois pas pourquoi...

si tes intitulés changent, les colonnes de ta table2 changeront aussi
pas dans le cas ou tu utilises un ID de type "Q x" et une
correspondance au niveau de la table1 comme ici :



OK.

ceci dit, si tu prevois de faire tourner tout ca sur un serveur web,
on peut imaginer que c'est un script (perl, php, etc...) qui genere
la table2 pour chaque nouvelle table1 donnée
mais, amha, on peut s'en sortir avec une structure generique

de rien, c'est une reflexion interessante



Tiens, à ce sujet, je viens de tomber sur PyTables, qui semble très
flexible puisque permettant de manipuler des tables
multi-dimensionnelles. Peut-être vais-jeter un coup d'oeil à la chose
dont les fonctionnalités sont décrites ici :

http://pytables.sourceforge.net/html-doc/usersguide1.html#section1.1

--
Denis.