8796 sujets

Développement web côté serveur, CMS

Bonjour,

voilà ce que je cherche à faire. J'ai actuellement une petite centaine de tables que contiennent toujours les même champs ( id, nom, temps, points) chaque table est identifiée par un nom + une date dans le style Bruxelles0910, Gre0809, etc et je voudrais tout remettre en une seule table avec (course*,nom, temps, points) course devient mon id unique et est le nom de la table exemple Bruxelles0910.

En Exemple

tables qui existent actuellement

Brugelette0708 ( id*, nom, temps, points) *id = champs auto num
Mons0708 ( id, nom, temps, points)
Bruxelles0708 ( id, nom, temps, points)
Bruxelles0809 ( id, nom, temps, points)
Anvers0809 ( id, nom, temps, points)
Grez0809 ( id, nom, temps, points)
Bruxelles0910 ( id, nom, temps, points)
Gand0910v ( id, nom, temps, points)

je voudrais avoir une nouvelle table Resultats

Resultats (courses, nom, temps, points)

Existe t il une fonction qui me permet de rassembler le tout et de me réinjecter les donnéés dans une nouvelle table, ou dois je créer une nouvelles table et introduire table par table les infos

en espérant d'avoir bien exprimer le problème

Christian
Modifié par belgitude (12 Oct 2009 - 20:52)
Je ne crois pas qu'il existe de fonction permettant de faire une telle chose. (logiquement inutile étant donné que le problème vient d'un défaut de conception de ta base de donnée).

Il va donc te falloir faire ça "à la main".

1/ Créer la table "Resultats"
2/ Y inséré les données de chaque tables successivement en ajoutant le nom de la table en question à chaque ligne et en supprimant la colonne "id".

Néanmoins ça reste assez simple et rapide à faire. Smiley cligne
cela rejoint mon idée.

Bref ce sont les erreurs de débutant dans le monde du msql php

mais c'est dans l'erruer que l'on, apprend Smiley ravi

Merci pour la réponse
Modérateur
Hello,

moust a écrit :
Je ne crois pas qu'il existe de fonction permettant de faire une telle chose. (logiquement inutile étant donné que le problème vient d'un défaut de conception de ta base de donnée).

Il va donc te falloir faire ça "à la main".
...


Hum.... et si on raccommode le tout de manières subtiles Smiley smile


CREATE TABLE uneTable AS 
(SELECT quelquechose 
FROM uneAutreTable 
WHERE uneChamp = 'une chose');
#CRÉE UNE TABLE uneTable COMME
# LA SÉLECTION DE quelque chose 
# VENANT DE uneTABLE 
# SUIVANT unChamp = 'une chose'


Également, tu pourrais avoir besoin de ce genre de choses :

UPDATE uneTable SET uneColonne = CASE 
WHEN uneAutreColonne = 'une valeur' THEN 'une valeur spécifique' 
WHEN encoreUnAutreColonne = 'encore une autre valeur' THEN 'une autre valeur spécifique' 
ELSE 'encore une autre valeur spécifique (par défaut)' END;

# MISE A JOUR DE uneColonne VENANT uneTable  
# SI/QUAND uneAutreColonne = 'une valeur' ALORS uneColonne = 'une valeur spécifique' 
# SI/QUAND encoreUnAutreColonne = 'encore une autre valeur' ALORS uneColonne = 'une autre valeur spécifique' 
# SINON uneColonne = 'encore une autre valeur spécifique (valeur par défaut)'
#FIN DE CONDITIONNELLE

* code fait de tête. Je peux m'être trompé.

Ceci n'est pas la solution ultime. Cependant, cela devrait t'aider dans l'immédiat. Il aurait été préférable dès le départ de bien concevoir ta base. Je recommande de revoir ta BDD afin d'exploiter au mieux ses capacités. Smiley cligne

<<<EDIT
Mettre ta clef primaire sur la course, ce n'est pas très judicieux me semble t'il. Par contre, mettre cette dernière sur son identifiant... Et donc, c'est la qu'arrive à grand pas les jointures de table.

Donc, il n'est peut être pas nécessaire de chambouler ta base. Avec les pistes que je t'ai données, DROP, ALTER, ADD, .... sont tes amis aussi.
EDIT;

En espérant t'avoir donné quelques bonnes pistes,
Bonne journée à toi

ps : N'oublie pas de :

* Faire une sélection afin de voir les données que tu veux supprimer par la suite.
* Sauvegarder avant toutes manipulations de ce type.
Modifié par Nolem (12 Oct 2009 - 18:58)
un grand merci pour les réponses.

La solution que j'ai adopté, c'est de créer une nouvelle table et de faire des inserts des données.

J'ai effectivement gardé un champs id (autonumber) mais j'ai rajouté un champs course.

merci pour votre aide et vos idées.
Salut,

ça peut aussi s'automatiser :
require_once('connexion.php');

$sql = 'DROP TABLE IF EXISTS courses';
mysql_query($sql);

$sql = ' CREATE TABLE courses (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`course` VARCHAR( 30 ) NOT NULL ,
`nom` VARCHAR( 30 ) NOT NULL ,
`temps` INT NOT NULL ,
`points` INT NOT NULL
)';
mysql_query($sql);

$champs = array('id', 'nom', 'temps', 'points');

$sql="show tables";
$result=mysql_query($sql);
while ($row = mysql_fetch_row($result)) {
	$champs_tab = array();
	$sql2 = 'show columns from '.$row[0];
	$result2 = mysql_query($sql2);
	while ($row2 = mysql_fetch_row($result2)) {
		$champs_tab[] = $row2[0];
	}
	// Est-ce une table à copier ?
	if($champs_tab == $champs) {
		echo '<p>Table '.$row[0].' en cours de copie</p>';
		$sql3 = 'Select nom, temps, points from '.$row[0];
		$result3 = mysql_query($sql3);
		while ($row3 = mysql_fetch_row($result3)) {
			$sql4 = "insert into courses (id, course, nom, temps, points) values ('', '".$row[0]."', '".$row3[0]."', ".$row3[1].", ".$row3[2].")";
			mysql_query($sql4);
		}
	}
}