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 04/12/2010, 17h28   #1
Membre du Club
 
Homme Benoît
Ingénieur développement logiciels
Inscription : mars 2003
Messages : 57
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2003
Messages : 57
Points : 45
Points : 45
Envoyer un message via MSN à Pignoufy
Par défaut Besoin d'aide sur une requête

Bonjour à tous,

J'ai besoin d'exécuter une requête en DB mais je ne sais pas vraiment comment l'écrire...

J'ai une table qui contient (entre autre) les colonnes suivantes :
  • id (la primary key de la table),
  • name (une clé métier qui n'est pas unique),
  • update_date (la date d'insertion de la donnée en DB)

Les lignes de ma table ne sont jamais mise à jour, c'est à dire que les lignes insérées sont immuables. Du point de vue "site oueb", on ne le sais pas, mais d'un point de vue "database" cela permet de visualiser l'historique de toutes les modifications...

Vous allez me dire "facile, il suffit de faire une requête :"
Code :
SELECT ... FROM ma_table WHERE name='toto' ORDER BY update_date DECS LIMIT 1
Ce qui est vrai si l'on souhaite afficher la dernière "version" (ou la plus récente) d'une donnée en particulier...

Mon problème est lorsque je souhaite lister toutes les données de ma table mais uniquement les plus récentes (donc d'un point de vue visuel, la colonne "name" est unique)

Avez vous une petite idée ?
Merci pour vos réponses...
Pignoufy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 17h44   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 957
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 : 10 957
Points : 18 165
Points : 18 165
Envoyer un message via MSN à CinePhil
Tu peux donner un exemple de données et le résultat attendu pour qu'on comprenne mieux ?
__________________
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 00
Vieux 04/12/2010, 18h45   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
Saluton,
Je pencherais pour une requête de ce type où n=1
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 20h59   #4
Membre du Club
 
Homme Benoît
Ingénieur développement logiciels
Inscription : mars 2003
Messages : 57
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2003
Messages : 57
Points : 45
Points : 45
Envoyer un message via MSN à Pignoufy
Citation:
Envoyé par CinePhil Voir le message
Tu peux donner un exemple de données et le résultat attendu pour qu'on comprenne mieux ?
Voici la structure de mes 2 tables :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
-- phpMyAdmin SQL Dump
-- version 3.3.8
-- http://www.phpmyadmin.net
--
-- Serveur: 127.0.0.1
-- Généré le : Sam 04 Décembre 2010 à 20:50
-- Version du serveur: 5.1.52
-- Version de PHP: 5.3.3
 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 
--
-- Base de données: `test`
--
 
-- --------------------------------------------------------
 
--
-- Structure de la table `component`
--
 
CREATE TABLE IF NOT EXISTS `component` (
  `cpt_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `cpt_number` varchar(10) NOT NULL,
  PRIMARY KEY (`cpt_id`),
  UNIQUE KEY `cpt_number` (`cpt_number`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
 
--
-- Contenu de la table `component`
--
 
INSERT INTO `component` (`cpt_id`, `cpt_number`) VALUES
(1, 'CPT_AAA'),
(2, 'CPT_BBB'),
(3, 'CPT_CCC');
 
-- --------------------------------------------------------
 
--
-- Structure de la table `component_history`
--
 
CREATE TABLE IF NOT EXISTS `component_history` (
  `cph_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `cpt_id` int(10) UNSIGNED NOT NULL,
  `cph_priority` enum('P0','P1','P2') NOT NULL,
  `cph_modification_date` datetime NOT NULL,
  PRIMARY KEY (`cph_id`),
  KEY `cpt_id` (`cpt_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;
 
--
-- Contenu de la table `component_history`
--
 
INSERT INTO `component_history` (`cph_id`, `cpt_id`, `cph_priority`, `cph_modification_date`) VALUES
(1, 1, 'P0', '2010-12-04 20:47:43'),
(2, 2, 'P1', '2010-12-04 20:47:43'),
(3, 3, 'P2', '2010-12-04 20:49:05'),
(4, 1, 'P2', '2010-12-04 20:49:25'),
(5, 2, 'P0', '2010-12-04 20:50:02');
 
--
-- Contraintes pour les tables exportées
--
 
--
-- Contraintes pour la table `component_history`
--
ALTER TABLE `component_history`
  ADD CONSTRAINT `component_history_ibfk_1` FOREIGN KEY (`cpt_id`) REFERENCES `component` (`cpt_id`) ON DELETE NO ACTION ON UPDATE CASCADE;
Comme vous pouvez le voir :
- la priorité du composant "CPT_AAA" était "P0" lors de sa création, puis a été modifié à "P2"
- celle du composant "CPT_BBB" était "P1" lors de sa création, puis a été modifié à "P0"
- celle du composant "CPT_CCC" est de "P2" et n'a pas changé...

Donc l'état courant est :
- CPT_AAA --> P2
- CPT_BBB --> P0
- CPT_CCC --> P2

C'est plus clair ?
Pignoufy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2010, 20h59   #5
Membre du Club
 
Homme Benoît
Ingénieur développement logiciels
Inscription : mars 2003
Messages : 57
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2003
Messages : 57
Points : 45
Points : 45
Envoyer un message via MSN à Pignoufy
Citation:
Envoyé par Maljuna Kris Voir le message
Saluton,
Je pencherais pour une requête de ce type où n=1
Je regarde...

J'ai regardé et c'est effectivement ce qu'il me fallait ! En reprenant la structure et les données ci-dessus, j'arrive à ce que je veux avec la requête suivante :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT h.cph_priority, h.cph_modification_date, c.cpt_number
FROM component_history h
INNER JOIN component c USING(cpt_id)
WHERE (
  SELECT COUNT(*)
    FROM component_history h1
    WHERE h1.cpt_id = h.cpt_id
    AND h1.cph_modification_date > h.cph_modification_date
) < 1
ORDER BY h.cph_priority ASC
Ce qui me donne :
Code :
1
2
3
4
cph_priority	cph_modification_date	cpt_number
P0	2010-12-04 20:50:02	CPT_BBB
P2	2009-12-04 20:49:05	CPT_CCC
P2	2010-12-04 20:49:25	CPT_AAA
Merci, Maljuna Kris !
Pignoufy 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 09h14.


 
 
 
 
Partenaires

Hébergement Web