Aller au contenu
billcom

Les sous requêtes c'est pas mon fort

Noter ce sujet :

Recommended Posts

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


Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • Contenu similaire

    • Par billcom
      Bonjour à tous,



      J'ai, sur un site d'offre d'emploi, une liste de domaines et plusieurs offres.


      Chaque offre à un domaine correspondant.



      Structure des tables :

      table domaine
      id_domaine
      nom_domaine
      ...

      table offre
      id_offre
      id_domaine
      date
      ...

      Sur une page du site, j'aimerai lister tous les domaines ainsi que les trois dernières offres du domaine en question.



      Pour avoir ce résultat, je fais actuellement :

      Une requête qui récupère les domaines;
      Puis quand j'affiche les domaines avec un foreach(), je fais une requête qui récupère les 3 dernières offres correspondant au domaine courant.
      Le problème, c'est que faire une requête dans une boucle n'a jamais été top et effectivement la page est longue à charger.



      J'ai alors mis en cache la requête (remember / j'utilise le framework Laravel) afin que la page soit plus rapide. Cependant au premier chargement la page met très longtemps a apparaître.



      J'aimerai optimiser ce premier chargement.



      J'ai essayé de faire une requête avec une sous-requête mais sans succès et je ne sais même pas si c'est possible.



      Si vous êtes un champion de SQL ou que vous voyer la faille dans mon raisonnement, j'attend votre aide



      Merci d'avance.

    • Par MissOlana
      Rebonjour à tous chers internautes,
      me revoila pour un probleme que je n'arrive pas à résoudre: (hey oui je suis une buse des fois (rire))
      Bon voici le script et mon probleme:

      J'utilise un select multiple pour proposer un choix de recherche: (Homme, femme, couple)

      <select multiple="multiple" name="recherche[]" multiple size="3"> <option data-img-src="icone-homme.png" value="1"></option> <option data-img-src="icone-femme.png" value="2"></option> <option data-img-src="icone-couple.png" value="3"></option></select> Je récupere les données de mon choix multiple
      <?phpif(isset($_POST['recherche'])){if(($_POST['recherche']) && !empty($_POST['recherche'])){$Col1_Array = $_POST['recherche'];//print_r($Col1_Array);foreach($Col1_Array as $selectValue){//affichage des valeurs sélectionnéesecho $selectValue."";}}}?> Le résultat s'affiche comme suit:
      si le membre clique sur homme et femme cela m'affiche: 1 et 2
      si le membre clique sur homme, femme couple : 1 et 2 et 3
      jusque là tout va bien !

      Mon souci et l'ajout dans ma base de données MSQL, je n'y arrive pas
      Voici ma base:

      Voici la solution expéré:
      La table "comptes"
      +---------------+------------+----------+---------+| nom | Choix1 | Choix2 | Choix3 |+---------------+------------+----------+---------+| MissOlana | 1 | 2 | 3 | (si j'ai choisi homme, femme couple)+---------------+------------+----------+---------+| Paul | 1 | | | (si il a choisi homme)+---------------+------------+----------+---------+| Pierre | | 2 | 3 | (si il a choisi femme et couple)+---------------+------------+----------+---------+
      En attente de vos lumiéres , merci encore les amis, je remercie aussi duplex13, Dadou, hsdino pour mes anciens soucis
    • Par elfaus
      Salut à tous,



      j'essaye d'optimiser un script php afin de n'avoir à réaliser qu'une seule requête et récupérer toutes les informations nécessaires. J'ai découvert il y a peu group_concat mais je ne suis parvenu à le faire fonctionner que sur un seul champ.



      Soit les deux tables sources suivantes :



      Heroes


      +----+-----------+------------+
      | id| name_fr | name_us |
      +----+-----------+------------+
      | 1 | ababab | ababab |
      | 3 | efefef | efefef |
      +----+-----------+------------+
      Schools


      +----+-----------+-----------+
      | id | name_fr | name_us |
      +----+-----------+-----------+
      | 3 | ababab | ababab |
      | 5 | cdcdcd | cdcdcd |
      | 9 | efefef | efefef |
      +----+-----------+-----------+

      Soit la table relationnelle suivante :
      Heroes_Schools


      +----+----+
      | hid|sid |
      +----+----+
      | 1 | 3 |
      | 1 | 5 |
      | 3 | 9 |
      +----+----+



      L'idée, est de faire en sorte de récupérer un résultat similaire à celui-ci


      +----+-----------+-----------+--------------------------------------------------+
      | id| name_fr | name_us | schools |
      +----+-----------+-----------+--------------------------------------------------+
      | 1 | ababab | ababab | 3, ababab, ababab; 5, cdcdcd, cdcdcd |
      | 3 | efefef | efefef | 9, efefef, efefef |
      +----+-----------+-----------+--------------------------------------------------+
      Afin de pouvoir par la suite faire un traitement de tableau en php et passer le contenu de schools en paramètre d'une autre class que celle réalisant la requête et stockant les information id, name_fr et name_us



      Pour l'instant j'ai ça :


      SELECT mch.id, mch.name_fr, mch.name_us, GROUP_CONCAT(mcs.id) AS schools_id, GROUP_CONCAT(mcs.name_fr) AS schools_name_fr, GROUP_CONCAT(mcs.name_us) AS schools_name_us

      FROM mom_cards_heroes AS mch
      LEFT JOIN mom_cards_heroes_schools AS mchs ON mch.id = mchs.heroesid
      LEFT JOIN mom_cards_schools AS mcs ON mchs.schoolid = mcs.id
      WHERE mch.`publish` = 1
      GROUP BY mch.id
      ORDER BY mch.factionid, mch.name_fr ASC

      Mais pas suffisant x)
    • Par vespa
      Bonjour,

      Je n'arrives pas à bâtir une requête.. J'ai une table "items" qui comportent plusieurs champs : name, description, date... Certaines lignes sont en doubles c'est à dire même "name", même "description" seul la date change

      Je dois supprimer tous les doublons en gardant le "name", "description" ayant la date la plus récente... J'ai passé mon dimanche sur ce SQL. Je précise que cette table est sur DB2 et que je n'ai aucun pouvoir dessus, je dois juste faire ce nettoyage. Merci d'avance pour votre aide.
    • Par sparh
      Bonjour,
      j'ai dans une table Membre de ma base sql contenant 10 000 enregistrement.

      Je souhaite vérifier que tel user_id correspond bien à tel user_name.

      J'ai 2 solutions :
      - faire une requête sql à chaque fois (si 1 résultat alors la correspondance existe)
      - faire une requête sql pour extraire user et userid que je met dans un tableau php et le tout en cache (durée de vie du cache très longue), quand j'ai besoin de vérifier, je n'ai qu'à chercher dans le tableau. (donc pas de requête sql)

      Quel est la solution la plus optimale selon vous ? (peux être y'a t'il de meilleur solutions auxquelles je n'ai pas pensé)

      Merci d'avance
×