SQL

Résolu/Fermé
DAG - 3 sept. 2008 à 12:05
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 - 3 sept. 2008 à 17:17
Bonjour,
J'ai un problème en SQL ! Je suis en train de développer une application en PHP avec une base de données.
J'ai une table UTILISATEUR avec plusieurs champs et notamment un champs CODE_POSTAL et un autre DEPARTEMENT.
J'ai une autre table DEPARTEMEMTS qui contiens les NUM et NOM_DEP. Comme on peut s'en douter le champs NUM contient le numéro du département et l'autre NOM_DEP contient le nom du département qui lui est associé.

Je cherche à faire une requête qui sélectionne le code postal de la table UTILISATEUR, récupère les deux premiers caractères puis les compares à ceux du champs NUM de la table DEPARTEMENT. Une fois le numéro de déparement trouvé, la requête récupère le nom du département dans le champs NOM_DEP de la table DEPARTEMEMTS et l'insert dans le champs DEPARTEMENT de la table UTILISTEURS.

J'ai essayé de faire un truc du genre :

	$statementDepOne = "
					SELECT 
						departements.ID,
						departements.num,
						departements.nom_dep,
						ouvrant_droit.ID,
						ouvrant_droit.prenom_OD,
						ouvrant_droit.nom_OD,
						ouvrant_droit.date_naissance_OD,
						ouvrant_droit.departement_OD,
						ouvrant_droit.code_postal_OD
					FROM 
						ouvrant_droit 
						INNER JOIN 
						departements
					;
					";
	$reqDepOne = mysql_query($statementDepOne) or die('<br>Erreur base de donnée !<br>' . $statementDepOne . '<br>'.mysql_error());	

	while($data = mysql_fetch_array($reqDepOne))
	{
		$statementDepTwo = "UPDATE ouvrant_droit 
										SET departement_OD = '" . $data[nom_dep] . "' 
										WHERE ('" . substr($data[code_postal_OD], 0, 2) . "='" . $data[num] . "');";
		$reqDepTwo = mysql_query($statementDepTwo) or die('<br>Erreur base de donnée !<br>' . $statementDepTwo . '<br>'.mysql_error());
		echo $statementDepTwo . "<br>";
	}


Mais forcément ça ne marche pas puisse qu'il prend chaque champs de la table DEPARTEMENT au fur et à mesure.

Quelqu'un aurai-t-il une idée ?
A voir également:

7 réponses

Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 388
3 sept. 2008 à 14:06
Bonjour,

Le code suivant devrait faire ce que tu veux (je ne l'ai pas testé)
$statementDepOne =
" SELECT Utilisateur.ID , Utilisateur.prenom_OD, Utilisateur.nom_OD,
    Utilisateur.date_naissance_OD, Utilisateur.departement_OD,
    Utilisateur.code_postal_OD ,
    (SELECT nom_dep FROM departements WHERE num = LEFT(Utilisateur.code_postal,2))
  FROM ouvrant_droit as Utilisateur;";

A toi de voir et tiens moi au courant
A plus
1
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 388
3 sept. 2008 à 15:13
Bonjour,
Ta solution est correcte également, quand à la question de performance, tout dépend si tu as un index sur la colonne NUM de ta table département.
A plus
1
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 388
3 sept. 2008 à 15:57
Bonjour,

Tu peux diminuer le nombre de fois que la table Departement est lue en rajoutant un ORDER BY CODE_POSTAL dans le SELECT sur ta table ouvrant_droit. Il te faut aussi déclarer deux nouvelles variables ANCIEN_CODE et NOUVEAU_CODE initialisés avec des blancs.
Pour chaque record lu dans ta table ouvrant_droit (mysql_fetch_array($reqDepOne)), tu assigne une valeur à la variable NOUVEAU_CODE étant égale au deux premiers caractères du code postal. Tu compares ensuite ANCIEN_CODE avec NOUVEAU_CODE, en cas de différence tu lis ta table département avec le NOUVEAU_CODE, ensuite tu mets la variable ANCIEN_CODE égale à la variable NOUVEAU_CODE.
A plus
1
Christounet Messages postés 1264 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 29 juillet 2010 1 388
3 sept. 2008 à 17:17
Bonjour,
De rien, n'oublies pas de mettre ton post comme résolu.
A plus
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup !

En fait j'ai eu le temps de faire autrement. Je le fais en plusieurs requêtes... Je pense que c'est moins performant, mais bon... Je suis un peu sous pression et je n'est pas trop le temps de faire mieux !

function departement()
{
	include '../bdd/connexion_bdd.php';

	$statementDepOne = "SELECT nom_OD, prenom_OD, date_naissance_OD, code_postal_OD FROM ouvrant_droit;";
	$reqDepOne = mysql_query($statementDepOne) or die('<br>Erreur base de donnée !<br>' . $statementDepOne . '<br>'.mysql_error());	
	echo $statementDepOne . "<br>";
	
	while($data = mysql_fetch_array($reqDepOne))
	{
		echo $data[nom_OD] . "<br>";
		echo $data[prenom_OD] . "<br>";
		echo $data[date_naissance_OD] . "<br>";
		echo $data[code_postal_OD] . "<br>";
		echo substr($data[code_postal_OD], 0, 2) . "<br>";
		$statementDepTwo = "SELECT nom_dep FROM departements WHERE num = '" . substr($data[code_postal_OD], 0, 2) ."';";
		$reqDepTwo = mysql_query($statementDepTwo) or die('<br>Erreur base de donnée !<br>' . $statementDepTwo . '<br>'.mysql_error());
		echo $statementDepTwo . "<br>";
		
		while($dataTwo = mysql_fetch_array($reqDepTwo))
		{
			echo $dataTwo[nom_dep] . "<br>";
			$statementDepThree = "UPDATE ouvrant_droit SET departement_OD = '" . str_replace("'","\'",$dataTwo[nom_dep]) . "' 
												WHERE (nom_OD = '" . str_replace("'","\'",$data[nom_OD]) . "' AND prenom_OD = '" . str_replace("'","\'",$data[prenom_OD]) . "' AND date_naissance_OD = '" . $data[date_naissance_OD] . "');";
			mysql_query($statementDepThree) or die('<br>Erreur base de donnée !<br>' . $statementDepThree . '<br>'.mysql_error());
			echo $statementDepThree . "<br><br>";									
		}
	}
}
0
Non je n'est pas d'index sur cette colonne. J'ai une autre colonne (ce sont les trois seule colonne de cette table) ID qui me sert d'index.
0
Merci de ton post, ça marche impeccable ! J'ai eu le temps d'effectuer les modifs et de faire qqu tests, je gagne qqu précieuses secondes pour des traitements de plus de 6000 entrées (avec d'autres traitements en parallèle dans la même boucle).

Merci encore

A+
0