Aller au contenu

Les sous requêtes c'est pas mon fort


billcom
Aller à la solution Solutionné par billcom,

Sujets conseillés

Bonjour,


Je me retrouve encore dans l'impasse aujourd'hui avec une requête imbriqué.



Ma base est structuré de cette façon :


Tables :



  • messagerie




  • messagerie_message_type




  • messagerie_utilisateur_type



Structure table messagerie :



  • id (int)




  • parent_id (int)




  • sujet (varchar)




  • contenu (text)




  • lu (bool)




  • message_type (int)




  • expediteur_id (int)




  • expediteur_type (int)




  • destinataire_id (int)




  • destinataire_type (int)




  • date (timestamp)



exemple :


[


'id' => 1,


'parent_id' => 0,


'sujet' => sujet test,


'contenu' => blablabla,


'lu' => 0,


'message_type => 2,


'expediteur_id' => 9,


'expediteur_type => 1,


'destinataire_id' => 5,


'destinataire_type' => 2,


'date' => 2015-07-29


]



Structure table messagerie_message_type :



  • id (int)




  • type (varchar)



exemple : [ 1 => question, 2 => message, 3 => demande d'infos ]



Structure table messagerie_utilisateur_type :



  • id (int)




  • type (varchar)



exemple : [ 1 => utilisateur, 2 => entreprise, 3 => ... ]



Relations entre les tables :



  • messagerie.message_type = messagerie_message_type.id




  • messagerie.expediteur_type = messagerie_utilisateur_type.id




  • messagerie.destinataire_type = messagerie_utilisateur_type.id




Je cherche à lister tous les messages qui concerne un utilisateur (expéditeur et destinataire donc).



Ma requête :


SELECT * FROM messagerie


WHERE (expediteur_id = x AND expediteur_type = 1)


OR (destinataire_id = x AND destinataire_type = 1)



Je récupère de cette façon les id des expéditeurs et destinataires.


J'aimerai appliquer un SELECT et faire une jointure différente selon chaque ligne retourné par la requête.



Je ne sais pas si cela est possible.


Je m'explique :


Je souhaite dans la requête ci-dessus pouvoir récupérer le nom_entreprise ou le nom et prenom selon si l’expéditeur est un utilisateur ou une entreprise.



Je ne peux pas faire une jointure normale car un utilisateur peut être à la fois un expéditeur sur un message et un destinataire sur un autre.



Je peux faire une boucle sur les résultats de la requête ci-dessus pour arriver à mes fins mais je sais que faire une requête en bouclant sur une autre ce n'est pas le mieux.



Si il y a des pros du SQL dans la salle merci de m'aider.



A bientôt


Lien vers le commentaire
Partager sur d’autres sites

  • Solution

Bon je suis fier de moi je m'en suis sorti tout seul.


Voilà le résultat :



select * from `messagerie`
left join `entreprise`
on `entreprise`.`id_entp` = `destinataire_id`
and `destinataire_type` = 2
or `entreprise`.`id_entp` = `expediteur_id`
and `expediteur_type` = 2
left join `xxx`
on `xxx`.`id_xxx` = `destinataire_id`
and `destinataire_type` = 3
or `xxx`.`id_xxx` = `expediteur_id`
and `expediteur_type` = 3
where (`expediteur_id` = 9 and `expediteur_type` = 1)
or ((`destinataire_id` = 9 and `destinataire_type` = 1))
and `parent_id` = 0
order by `date` desc
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...