[RÉSOLU] [SQL] simplifier 4 requetes en 1

simplifier 4 requetes en 1 [RÉSOLU] [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 22-11-2018 à 16:42:49    

Bonjour,
 
Voici les tables j'utilise : J'ai retiré tous les champs inutile afin d'améliorer la clarté:
 

Code :
  1. CREATE TABLE CENTRES (
  2.   numcentre TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   numgerantsite MEDIUMINT UNSIGNED NOT NULL,
  4.   numresponsablesite MEDIUMINT UNSIGNED NOT NULL,
  5.   numsuiviadmifinance MEDIUMINT UNSIGNED NOT NULL,
  6.   numresponsablepeda MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
  7.   PRIMARY KEY(numcentre)
  8. );
  9. Exemple de valeur de la table
  10. umcentre => 15
  11. numgerantsite => 31
  12. numresponsablesite => 37
  13. numsuiviadmifinance => 41
  14. numresponsablepeda => 23
  15. CREATE TABLE GENS (
  16.   numgens MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  17.   titregens ENUM('M','Mme','Me','Dr','Pr') NOT NULL,
  18.   nomgens VARCHAR(50) NOT NULL,
  19.   prenomgens VARCHAR(50) NOT NULL,
  20.   PRIMARY KEY(numgens)
  21. );


 
je souhaite faire une requete SQL afin de rattacher les champs numresponsablesite à un numgens, numgerantsite à un autre numgens,...
 
Actuellement je fais une requête SQL pour trouver chaque nom mais je voudrais savoir si en 1 seule requête c'était possible. Juste dans un but d'optimisation du code.

Code :
  1. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numgerantsite
  2. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numresponsablesite
  3. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numsuiviadmifinance
  4. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numresponsablepeda


 
J'ai essayé :

Code :
  1. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numgerantsite
  2. UNION
  3. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numresponsablesite
  4. UNION
  5. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numsuiviadmifinance
  6. UNION
  7. SELECT concat(titregens," ",prenomgens," ",nomgens) FROM gens, centres WHERE numgens = numresponsablepeda


mais je trouve ça pas très propre !
 
si vous avez des idées, une solution plus simple, le top serait d'avoir 1 requete qui donnerais ce résultat :
numgerantsite | numresponsablesite | numsuiviadmifinance | numresponsablepeda
M truc muche  | M machin chose       | Mme machine bidule  | Mme machine chose
 
Edit : Résolu :jap:


Message édité par stef_dobermann le 28-11-2018 à 14:54:45

---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 22-11-2018 à 16:42:49   

Reply

Marsh Posté le 22-11-2018 à 23:26:58    

Salut,
 
Regarde les jointures.
 
Un truc comme ca:

Code :
  1. SELECT
  2.            concat(G1.titregens," ",G1.prenomgens," ", G1.nomgens) as numgerantsite ,           
  3.            concat(G2.titregens," ",G2.prenomgens," ", G2.nomgens) as numresponsablesite,           
  4.            concat(G3.titregens," ",G3.prenomgens," ", G3.nomgens) as numsuiviadmifinance,           
  5.            concat(G4.titregens," ",G4.prenomgens," ", G4.nomgens) as numresponsablepeda
  6.        FROM centres
  7.        LEFT JOIN gens as G1 on G1.numgens = numgerantsite
  8.        LEFT JOIN gens as G2 on G2.numgens = numresponsablesite
  9.        LEFT JOIN gens as G3 on G3.numgens = numsuiviadmifinance
  10.        LEFT JOIN gens as G4 on G4.numgens = numresponsablepeda


   


Message édité par dede_sav le 22-11-2018 à 23:31:37
Reply

Marsh Posté le 22-11-2018 à 23:27:05    

Je sais pas si j'ai bien tout compris mais je pense qu'avec plusieurs jointures sur la même table (en inner join ou left join) ça devrait le faire.

Code :
  1. SELECT concat(g1.titregens," ", g1.prenomgens," ", g1.nomgens) AS GERANT,
  2. concat(g2.titregens," ", g2.prenomgens," ", g2.nomgens) AS RESPSITE, ....
  3. FROM CENTRES c INNER JOIN GENS g1 ON (c.numgerantsite = g1.numgens)
  4. INNER JOIN GENS g2 ON (c.numresponsablesite = g2.numgens)...


Bref, t'as compris l'idée : tu rajoutes dans le SELECT les 2 autres colonnes et dans le FROM, 2 fois encore la table GENS avec les liens sur les bons champs. Tu peux mettre des LEFT JOIN si certains ID dans ta table CENTRES peuvent être NULL mais vu la déclaration de tes tables, ça semble pas être le cas.


Message édité par rufo le 22-11-2018 à 23:28:28

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2018 à 08:53:56    

C'est très con, mais je n'avais pas pensé à mettre mettre la table jointe en g1 g2,...
Ca marche nikel. Merci beaucoup :jap:


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 23-11-2018 à 08:57:12    

Merci les gars, ça marche nickel :jap:
j'avais pensé à inner joint, mais pas en faisant référence comme ça à l'autre table !


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 23-11-2018 à 09:36:00    

Pas de quoi :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed