Résolu Problème de requête mySQL

O-steal

Habitué
Bonjour,

Je dois modifier une vieille requête sur un vieux site. J'ai donc du mal à trouver des information sur comment la réaliser car tout le monde propose d'utiliser des méthodes plus récentes et simples.

Voici la requête et ce que j'ai rajouté :

PHP:
SELECT DISTINCT
		p.pnom AS pnom,
		p.id AS id,
		h.nom AS hnom,
		t.description AS type_visite,            //ligne rajoutée
		MAX(cr.date_visite) AS date_visite,
		YEAR(CURRENT_DATE)-YEAR(p.date_naissance) AS age
	FROM T_PATIENT p
	LEFT OUTER JOIN T_HOPITAL h
		ON h.id = p.hopital
	LEFT OUTER JOIN T_CR cr
		ON cr.patient = p.id	
	LEFT OUTER JOIN T_TYPEVISITE t    //ligne rajoutée
		ON t.id = cr.typeVisite                   //ligne rajoutée
;

Voici le problème rencontré : le "type_visite" que je récupère à la fin est complètement faux :/
Ce que j'essayait de faire c'est récupérer l'id du TYPEVISITE correspondant au CR qui correspond au PATIENT pour ensuite mettre la description correspondante dans une variable. Je ne vois pas où j'ai fais une erreur sachant que j'ai copié exactement ce qui était fait pour les autres variables et qui fonctionnent parfaitement.

A bientôt!
 

BlackPage

Grand Maître
Salut,
" LEFT OUTER JOIN T_TYPEVISITE t //ligne rajoutée ON t.id = cr.typeVisite "
Déjà pas sur que le left outer soit judicieux, un LEFT JOIN devrait faire l'affaire.
Ensuite, t.id = cr.typeVisite signifie que le champ t.id doit être égal au champ cr.typeVisite. Je ne sais pas comment sont les jointures des tables ni quelle table doit logiquement être reliée à une autre en fonction des données qu'elles contiennent mais si T_CR ne contient pas l'info qui puisse identifier de manière certaine l'id du type de visite alors c'est normal que ca renvoie du faux... Doit y avoir un micmac à ce niveau.
Bon courage !
 

O-steal

Habitué
Le LEFT OUTER est justifié car il n'y a qu'u seul type de visite possible et logique par CR. De même le problème ne vient t.id=cr.typeVisite car ses données sont bien identiques. Par contre je me demande si le problème ne viendrait pas du fait que dans cette jointure, aucune des tables n'est celle qui et appelée dans FROM?
 

BlackPage

Grand Maître
Meilleure réponse
Le FROM inclut la table p et toutes les tables issues des JOIN donc h, cr et t donc c'est censé se tenir... Pour moi le problème doit venir d'une jointure incorrecte quelque part ou d'un problème de données mal liées... Mais encore une fois sans connaitre la structure exacte ni le contenu c'est pas facile à dire^^
Bon courage !
 

O-steal

Habitué
Le problème venait d'un "group by"... maintenant plus qu'à trouver une solution pour afficher l'information que je veux :/

Tu aurais une solution pour faire en sorte que l'ordre du regroupage, ce ne soit pas les données les plus anciennes mais les plus récentes qui soient lues? ou alors, sachant qu'une des colonne dans le select est max() faire en sorte que ce soient les valeurs sur la même ligne que ce "max()" qui soient affichées? Ou encore : faire en sorte que la BDD lise la requête dans l'autre sens pour qu'au final la valeur par défaut après regroupement soit celle que je veux?

Merci d'avance et désolé pour ma question d'avant.. le group by était caché dans une fin de requête que j'ai regardé trop vite...
 

zeb

Modérateur
Salut,

Et oui, il y a une fonction de regroupement pour date_visite mais rien pour les autres.
C'est une erreur qu'un moteur comme ORACLE ne laisse pas passer alors qu'un MySQL l'accepte et décide pour toi quoi renvoyer.
Quand on doit mettre une clause DISTINCT dans une requête, en général, c'est qu'on pouvait faire mieux ;)
Ta requête était mal écrite du départ.

Dans ton cas, j'imagine une solution qui ressemblerait à ça (*) :
SQL:
SELECT .. FROM TABLE1 JOIN (SELECT .. FROM TABLE2 JOIN TABLE3)

(*) pseudo code
 

O-steal

Habitué
J'avais déjà essayé sans succès mais j'avais fait des erreurs! voici ma solution qui fonctionne en local mais pas sur le site en ligne :/ Une idée? problème de version?
Code:
SELECT DISTINCT
		p.pnom AS pnom,
		p.id AS id,
		h.nom AS hnom,
		cr2.date_visite AS date_visite,
		cr2.description AS type_visite,
		YEAR(CURRENT_DATE)-YEAR(p.date_naissance) AS age
	FROM T_PATIENT p
		LEFT OUTER JOIN (SELECT t.description, cr.date_visite, cr.patient, cr.typeVisite  FROM T_CR cr left outer JOIN t_typevisite t
			ON t.id=cr.typeVisite ORDER BY cr.id DESC) cr2
			ON cr2.patient = p.id
		LEFT OUTER JOIN T_HOPITAL h
			ON h.id = p.hopital
	WHERE  1 AND h.id=20
	GROUP BY p.id ASC
	ORDER BY date_visite DESC
LIMIT 20
 

zeb

Modérateur
Salut,

Quelles sont les erreurs ?
Quels sont les moteurs de BDD en local ? en ligne ?
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 049
Membres
1 586 282
Dernier membre
Yannick3553
Partager cette page
Haut