Créer une table actuel à partir d'une table h

Fermé
cleminute - 20 oct. 2009 à 12:22
 cleminute - 24 oct. 2009 à 09:32
Bonjour tout le monde. Je plante depuis un moment sur un projet sur lequel je travaille.
J’ai deux tables (la table donnees et la table actuel). La table « donnees » conserve toutes les données ajoutées. Par contre la table « actuel » ne conserve que les derniers enregistrements.
J’explique ce que je veux mettre en œuvre. L’utilisateur ajoute les données à partir d’un formulaire que j’ai mis en place. Je veux qu’à partir d’un code php que lorsque l’utilisateur ajoute une donnée via le formulaire que les informations se logent dans la table « donnees » et aussi qu’au même moment que la table « actuel » se mette à jour et que la table « actuel » ne contienne que le dernier enregistrement de pour chaque « CODE PLANTEUR ».
Je veux savoir si cela est possible. Et comment mettre en œuvre. Aidez-moi, je suis dans le besoin. Si quelqu’un a u tutoriel ou du code, je suis preneur. Merci d’avance
Voici la structure de mes tables.
CREATE TABLE `donnees` (
`id` int(11) NOT NULL auto_increment,
`idu` int(11) NOT NULL default '0',
`motcle` text NOT NULL,
`codeentreprise` varchar(150) NOT NULL default '',
`mois` varchar(150) NOT NULL default '',
`prixAchat` varchar(150) NOT NULL default '',
`datepaiement` text NOT NULL,
`codeplanteur` varchar(150) NOT NULL default '',
`nbrelevement` varchar(150) NOT NULL default '',
`modepaiement` varchar(150) NOT NULL default '',
`netpayer` varchar(150) NOT NULL default '',
`bank` varchar(50) NOT NULL default '',
`poidstotaleleve` varchar(150) NOT NULL default '',
`tsModif` timestamp NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idu` (`idu`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=108 ;

CREATE TABLE `actuel` (
`id` int(11) NOT NULL auto_increment,
`idu` int(11) NOT NULL default '0',
`motcle` text NOT NULL,
`codeentreprise` varchar(150) NOT NULL default '',
`mois` varchar(150) NOT NULL default '',
`prixAchat` varchar(150) NOT NULL default '',
`datepaiement` text NOT NULL,
`codeplanteur` varchar(150) NOT NULL default '',
`nbrelevement` varchar(150) NOT NULL default '',
`modepaiement` varchar(150) NOT NULL default '',
`netpayer` varchar(150) NOT NULL default '',
` bank` varchar(50) NOT NULL default '',
`poidstotaleleve` varchar(150) NOT NULL default '',
`tsModif` timestamp NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `idu` (`idu`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=90 ;
A voir également:

9 réponses

Bonjour c’est cleminuite sur le forum commentçamarche.net. Tu as commencé à m’aider à résoudre mon problème et je vous prie de m’aider le finaliser.
En fait, il y a un problème avec la requête ($sql='SELECT * FROM table GROUP BY champ ORDER BY id DESC';). Le problème est que la requête n’affiche pas le dernier enregistrement lorsqu’il y a plusieurs enregistrements pour le même « code planteur ». Je ne sais pas comment résoudre cette difficulté. Par exemple pour le code planteur « JUSTIN », il y a 2 enregistrements mais au lieu d’afficher celui dont le id=9 c’est celui dont le id=8 qu’il affiche.

Voici ma table et son contenu afin de vous permettre de mieux m’aider.


CREATE TABLE `donnees` (
`id` int(11) NOT NULL auto_increment,
`motcle` text NOT NULL,
`codeentreprise` varchar(150) NOT NULL default '',
`mois` varchar(150) NOT NULL default '',
`prixAchat` varchar(150) NOT NULL default '',
`datepaiement` text NOT NULL,
`codeplanteur` varchar(150) NOT NULL default '',
`nbrelevement` varchar(150) NOT NULL default '',
`modepaiement` varchar(150) NOT NULL default '',
`netpayer` varchar(150) NOT NULL default '',
`bank` text NOT NULL,
`poidstotaleleve` varchar(150) NOT NULL default '',
`tsModif` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `id_2` (`id`),
KEY `id_3` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

--
-- Contenu de la table `donnees`
--

INSERT INTO `donnees` VALUES (1, 'PALMAFRIQUE', 'PALMAFRIQUE', 'Janvier', '25', '23-10-2009', 'DADIS', '5', '15000', '127825', '', '1212', '2009-10-23 08:58:45');
INSERT INTO `donnees` VALUES (2, 'PALMAFRIQUE', 'PALMAFRIQUE', 'Janvier', '25', '23-10-2009', 'KONE', '1', 'Virement', '4545', '', '12', '2009-10-23 08:59:30');
INSERT INTO `donnees` VALUES (3, 'FFF', '', 'Janvier', '25', 'GGFG', 'FE', '1', 'Virement', 'FFE', 'BICICI', 'FF', '2009-10-23 08:59:30');
INSERT INTO `donnees` VALUES (4, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'KOFFI', '1', 'Chèque', '8325', 'VERSUS BANK', '333', '2009-10-23 09:08:15');
INSERT INTO `donnees` VALUES (5, 'PALMAFRIQUE', 'palmafrique', 'Novembre', '25', '23-10-2009', 'KONAN', '15', 'Espece', '300000', 'BICICI', '12000', '2009-10-23 09:10:21');
INSERT INTO `donnees` VALUES (6, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'KOUASSI', '1', 'Cheque', '25000', 'ECOBANK', '1000', '2009-10-23 09:11:09');
INSERT INTO `donnees` VALUES (7, 'PALMAFRIQUE', 'palmafrique', 'Mai', '25', '23-10-2009', 'CAMARA', '10', 'Autres', '1581275', 'SGBCI', '63251', '2009-10-23 10:06:15');
INSERT INTO `donnees` VALUES (8, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'JUSTIN', '1', 'Espece', '36350', 'ECOBANK', '1454', '2009-10-23 10:20:14');
INSERT INTO `donnees` VALUES (9, 'PALMAFRIQUE', 'palmafrique', 'Janvier', '25', '23-10-2009', 'JUSTIN', '3', 'Espece', '1364675', 'SIB', '54587', '2009-10-23 10:29:56');


Merci d’AVANCE
1
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 475
20 oct. 2009 à 12:30
Pas besoin de deux tables pour ça.

Une simple requête te permettra d'obtenir le dernier enregistrement.

Exemple:
$sql='SELECT * FROM table ORDER BY id DESC LIMIT 1';

Cette requête va trier tes données par id décroissant et ne prendre que le premier. Autrement dit le dernier id donc le dernier enregistrement.
Tu suis ?
0
Merci pour ta réponse. Mais ce que je veux est que lorsque l'utilisateur ajoute une donnée la table actuel se mette à jour automatique et la table actuel ne conserve que le dernier enregistrement de chaque code planteur.
0
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 475
20 oct. 2009 à 21:08
ça je comprends bien. Hormis pour une utilisation bien particulière que tu ne précise pas ici, une requête comme celle que j'ai donné te permet d'afficher le même résultat puisqu'elle te donne le dernier enregistrement de ta table données et donc les même informations que celle que tu voudrai mettre dans la table actuel.

Donc pourquoi passer par une seconde table pour obtenir un résultat équivalent ?
0

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

Posez votre question
Je m'explique. Il y a pour chaque "code planteur" plusieurs enregistrements. Prenons comme exemple 5 codes planteurs ( KONAN, KOUASSI, YAO, ZATTA, KOFFI). et donc pour chacun de ces "code planteur", il y a plusieurs enregistrements. Tous ces enregistrements sont stockés dans la table "donnees" qui constitue la table historique ensuite je veux insérer dans la table "actuel" le dernier enregistrement du code planteur "KONAN", le dernier enregistrement du code planteur "KOUASSI", le dernier enregistrement du code planteur"YAO",le dernier enregistrement du code planteur"ZATTA",le dernier enregistrement du code planteur"KOFFI",.....
Or ta requête n'affiche que le dernier enregistrement de la table données et non celui des différents "code planteur". En fait, la table "actuel" est celle que je mets à la disposition des utilisateurs. La table "donnees" est la table historique qui contient tous les enregistrements sans distinction. Ce que je veux c'est que lorsqu'on ajoute un nouvel enregistrement dans la table "donnees", le système vérifie si le "code planteur" existe dans la table "actuel". S'il existe alors l'ancien enregistrement est écrasée par la nouvelle. S'il n'existe pas alors il est ajouté à la table "actuel".
Aidez moi, cela fait plusieurs semaines que je n'arrive pas à mettre une telle requête en place.
0
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 475
21 oct. 2009 à 11:31
Je comprends mieux.

Tu peux toujours le faire à partir d'une seule et même table en fait.

$sql='SELECT * FROM table GROUP BY champ ORDER BY id DESC';

La différence avec cette requête:
Je groupe la lecture des données par champ (à remplacer par la colonne correspondant au nom de code planteur).
ORDER BY me donnera le dernier pour chaque code planteur.
Si tu as une colonne correspondant à la date, tu peux aussi trier par date ce qui reviendrai au même.

Je pense que ça correspondra mieux à ce que tu veux.
0
Grand merci à toi. C'est exactement ce que je voulais. Je te dis encore une fois grand merci.
Je réfléchis maintenant à comment insérer automatiquement cette requête dans la table"actuel". Car je veux que l'insertion se fasse automatiquement dans la table "actuel" à chaque ajout à partir du formulaire.
Si tu as une idée de la manière de faire, je serai très heureux.
0
arthezius Messages postés 3538 Date d'inscription jeudi 15 mai 2008 Statut Membre Dernière intervention 11 septembre 2016 475
22 oct. 2009 à 12:01
Une encore (au risque de paraître obstiné) je comprends pas pourquoi tu as besoin d'enregistrer ceci puisque la requête peut à elle seul t'afficher automatiquement ce que tu as besoin sur la page que tu veux.

Je m'explique autrement.
Si tu te sers de la requête que je t'ai donné pour afficher le dernier enregistrement pour chaque code, pour ensuite l'enregistrer dans la table actuel, pour ensuite faire une autre requête pour afficher cet enregistrement sur une page, je vois pas l'intérêt.
Je suppose que c'est ainsi que ça va te servir. Autant simplement placer ma requête directement sur cette page sans passer par une seconde table.
Ou alors il y a encore quelques choses qui m'échappe et j'aurai besoin a nouveau d'un éclaircissement.
0
OK ,Je t'explique pourquoi je dois enregistrer le résultat de la requête dans la table "actuel". Le gestionnaire de l'interface dois pouvoir exporter la table "actuel" sur son ordinateur chaque jour . Ensuite, cette table sera installée sur une autre plateforme afin que les utilisateurs la consulte en envoyant un sms avec pour mot clé "le code planteur".
La table "donnee", elle constitue la table historique. Aussi je ne sais pas pourquoi mais quand par exemple 3 fois le même code planteur, il n'affiche que le premier ou le deuxième au lieu du dernier. Selon toi où se trouve le problème?
0