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 13/01/2012, 23h28   #1
Membre du Club
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 73
Points : 57
Points : 57
Par défaut fusionner des tuples

Bonsoir

Pour du décisionnel dans de l’hôtellerie, j'ai une vue au format suivant
Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE `v_statut_passager` (
	`Id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
	`Passager` MEDIUMINT(8) UNSIGNED NULL DEFAULT '0',
	`TypeLogement` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
	`Residence` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
	`Source` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
	`Statut` TINYINT(3) UNSIGNED NULL DEFAULT NULL
	[.....]
) ENGINE=MyISAM;
Celle ci affiche le statut (Statut: réservation, occupation, abandon...) d'une personne (Passager) dans un logement (TypeLogement: T1, T2, T3...) dans une résidence (Residence). L'information peut provenir de 2 applications métier différentes (Source: 'AGLAE' ou 'Heberg'). Bien évidement, chaque source peut fournir un statut différent. Le but est de retourner dans une requête un enregistrement par ligne qui résume les 2 statuts possibles.

Donc lorsque je fais une requête du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT passager.ine, passager.nom, passager.prenom, logement.libelle, 
case vue.source when "1" then statut.Libelle end AS aglae, 
case vue.source when "2" then statut.Libelle end AS heberg
 
FROM v_statut_passager AS vue
 
JOIN t_passager AS passager         ON passager.Id = vue.Passager
JOIN t_typelogement AS logement     ON logement.id = vue.TypeLogement
JOIN t_statut AS statut             ON statut.id = vue.Statut
JOIN t_source AS source             ON source.id = vue.source
 
 
WHERE vue.Residence = 43
 
#group by passager.Id
 
ORDER BY passager.Nom, passager.Prenom
Je me retrouve avec deux tuples qui représentent la même personne :
Code :
1
2
3
nom	prenom	libelle	aglae		heberg
DUPONT	Bob	T1	Occupation	NULL
DUPONT	Bob	T1	NULL		Réservation
L'idée serait de récupérer un truc comme ceci :
Code :
1
2
nom	prenom	libelle	aglae		heberg
DUPONT	Bob	T1	Occupation	Réservation
iliak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 13h31   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

il faut faire un group by :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT passager.ine, passager.nom, passager.prenom, logement.libelle, 
max(case vue.source when "1" then statut.Libelle end) AS aglae, 
max(case vue.source when "2" then statut.Libelle end) AS heberg
 
FROM v_statut_passager AS vue
 
JOIN t_passager AS passager         ON passager.Id = vue.Passager
JOIN t_typelogement AS logement     ON logement.id = vue.TypeLogement
JOIN t_statut AS statut             ON statut.id = vue.Statut
JOIN t_source AS source             ON source.id = vue.source
 
 
WHERE vue.Residence = 43
 
GROUP BY passager.Nom, passager.Prenom, logement.libelle
 
ORDER BY passager.Nom, passager.Prenom
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 18h55   #3
Membre du Club
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 73
Points : 57
Points : 57
Bonsoir,

Merci, ça semble marcher. Tu me dis qu'il faut que j'utilise un group by, c'est ce que j'essayais (cf la ligne en commentaire).

Tu rajoutes un max() autour des cases et c'est ce qui semble faire que la mayo prenne. Histoire de comprendre ce qu'il se passe, pourrais tu expliquer stp ?

Merci en tout cas !
iliak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 21h01   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 873
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 873
Points : 1 360
Points : 1 360
salut,

en fait c'est un artifice qui est basé sur le fait que max te renverra la valeur non nulle (si elle existe) de ton groupage...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 22h19   #5
Membre du Club
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 73
Points : 57
Points : 57
Donc si j'ai bien compris, le group by (par défaut) ne va pas chercher à analyser tous les enregistrements retournés mais juste les grouper. Avec le max(), ça va traiter chaque groupement ?
iliak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 02h27   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 873
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 873
Points : 1 360
Points : 1 360
l'idée pour comprendre de manière simple les choses c'est:
  • on recherche dans la table principale selon les conditions de la clause where en appliquant les jointures éventuelles pour obtenir le jeu de résultats
  • on regroupe et trie (éventuellement) grâce à ce que tu as dans la clause group by ensuite et, s'il y a une clause having, on élimine éventuellement une partie des résultats ainsi obtenu

les fonctions ensemblistes sont donc appelées pour chaque résultats que regroupe le group by pour faire évoluer la valeur à retourner tout en la conservant entre chaque appel (contrairement aux fonctions classiques).

la plupart des fonctions ensemblistes (dont notamment min, max), si tu as aucune valeur te retourne null sinon te retourne la première valeur valide...

ici par exemple: max(null,'Réservation')='Réservation'
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 10h26   #7
Membre du Club
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 73
Points : 57
Points : 57
C'est bien ce qu'il me semblait.

Merci bien !
iliak 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 23h26.


 
 
 
 
Partenaires

Hébergement Web