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 24/07/2011, 02h19   #1
Invité régulier
 
Homme Thomas
Étudiant
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 5
Points : 5
Par défaut Insertion en auto-référence avec condition where

Bonjour à tous,


Je travaille actuellement sur une application concernant une société exploitant un réseau de bus, j'ai donc une table ligne selon cette structure :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--
-- Structure de la table `ligne`
--
 
CREATE TABLE IF NOT EXISTS `ligne` (
  `ID_LIGNE` int(11) NOT NULL AUTO_INCREMENT,
  `ID_DATE` int(11) NOT NULL,
  `NUMERO_LIGNE` varchar(100) NOT NULL,
  `NOM_LIGNE` varchar(100) NOT NULL,
  `DISTANCE_FIXE` int(11) DEFAULT NULL,
  `DISTANCE_SAD_THEORIQUE` int(11) DEFAULT '0',
  `TX_SAD` float DEFAULT NULL,
  `DISTANCE_SS_TRAITEE` int(11) DEFAULT '0',
  `NOMBRE_COURSES_TOTALE` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID_LIGNE`),
  UNIQUE KEY `AK_INFOS_LIGNE` (`ID_DATE`,`NUMERO_LIGNE`)
) ENGINE=InnoDB  DEF
Chaque ligne existe donc à un mois donné (le couple MOIS-ANNEE correspondant à un et seul ID_DATE), ce qui pose le problème suivant : le client doit chaque mois recréer les lignes de bus une par une à travers les formulaires prévus à cet effet.

J'ai donc pensé à la solution suivante pour simplifier le processus : le client choisit un mois et une année, à partir de l'ID_DATE récupéré le système récupère les informations concernant les lignes du mois précédent (ID_DATE - 1) et insére ces données pour le mois choisit.

Exemple : le client choisit de créer les lignes du mois de Septembre 2011, le système récupère les informations des lignes de Août 2011 (le mois précédent) et insère ces donnés pour Septembre 2011.

Je dois donc effectuer une insertion en auto-référence mais je ne comprends pas comment intégrer les where correctement (un pour le SELECT et un pour le INSERT).

Code :
1
2
3
SELECT NUMERO_LIGNE, NOM_LIGNE, DISTANCE_FIXE, DISTANCE_SAD_THEORIQUE
       FROM   LIGNE
       WHERE  ID_DATE = ID_DATE_PRECEDENT
Code :
1
2
3
4
INSERT INTO LIGNE (NUMERO_LIGNE, NOM_LIGNE, DISTANCE_FIXE, DISTANCE_SAD_THEORIQUE) 
       //le résultat du SELECT ci-dessus
       FROM   LIGNE
       WHERE  ID_DATE = ID_DATE_SELECTIONNE
Le manuel MySQL me laisse penser qu'il faut renommer la table ligne mais je n'ai pas plus d'informations concernant l'utilisation des where et tout ce que j'ai essayé pour l'instant a échoué, je m'en remet donc à vous en espérant avoir été assez explicite !

Merci d'avance !
_Thomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2011, 10h38   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 015
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 015
Points : 18 298
Points : 18 298
Envoyer un message via MSN à CinePhil
Il faut créer une table temporaire avec le SELECT puis utiliser cette table temporaire dans l'INSERT.
Les deux requêtes doivent être lancées à la suite dans la même connexion.

Mais tu as quand même un problème de modélisation car tu répètes les mêmes informations chaque mois dans de nouvelles lignes, ce qui crée de la redondance de données.
Si ce n'est pas trop tard, je te conseille vivement de revoir ton modèle de données !
__________________
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/07/2011, 19h57   #3
Invité régulier
 
Homme Thomas
Étudiant
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 5
Points : 5
Ok merci de la réponse rapide, je pense que j'ai réussi à faire tout ça :
Code :
1
2
3
4
5
6
CREATE TEMPORARY TABLE ligne_selected SELECT ID_DATE, NUMERO_LIGNE, NOM_LIGNE, DISTANCE_FIXE, DISTANCE_SAD_THEORIQUE FROM LIGNE WHERE ID_DATE = 1
ORDER BY ID_LIGNE;
 
INSERT INTO LIGNE (ID_DATE, NUMERO_LIGNE, NOM_LIGNE, DISTANCE_FIXE, DISTANCE_SAD_THEORIQUE) 
       SELECT ID_DATE+1, NUMERO_LIGNE, NOM_LIGNE, DISTANCE_FIXE, DISTANCE_SAD_THEORIQUE
       FROM   ligne_selected;
Concernant la modélisation, je sais que ce n'est pas très rigoureux mais cela correspond à l'utilisation que le client veut en faire et compte tenu de l'avancement du développement je ne peux pas tellement changer mon modèle.

En tout cas merci bien pour le coup de pouce, ça m'a bien aidé et motivé !
_Thomas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h47.


 
 
 
 
Partenaires

Hébergement Web