Question MySQL - jointures externes

Répondre
InTheMix
InTheMix
Déconnecté
Hello,

Je m'essaie aux jointures externes depuis hier, de façon à simplifier mes requêtes. Simplifier dans le sens "ne faire qu'une requête" à la place dans faire plusieurs de suites.

Alors, j'expose un peu...

C'est une requête entre 5 tables.

users : table qui contient les noms des utilisateurs ainsi que l'id_group (qui correspond au groupe de la table groups)

opentask : table "lien" entre users et task

openpauses : table "lien" entre users et pauses

task : table qui contient les différentes tâches à effectuer

pauses : table qui contient les différentes pauses ( = horaires de travail du style 8h-15h, 15h-22h ...)

Pour l'instant, j'utilise la requête suivante :

  1.  
  2. SELECT u.id_users, u.name, u.surname, ot.id_task, op.id_pause, t.namefr, t.namenl, t.level, p.tag
  3. FROM users u
  4. LEFT OUTER JOIN opentask ot
  5. ON u.id_users = ot.id_users AND '2009-06-29' BETWEEN ot.datestart AND ot.dateend
  6. LEFT OUTER JOIN openpauses op
  7. ON u.id_users = op.id_users AND '2009-06-29' BETWEEN op.datestart AND op.dateend
  8. LEFT OUTER JOIN pauses p
  9. ON op.id_pause = p.id_pause
  10. LEFT OUTER JOIN task t
  11. ON t.id_task = ot.id_task
  12. WHERE u.id_groups = '2'
  13.  


Le principe, c'est d'afficher les noms des users qui ont une pause et/ou une tâche à effectuer à la date donnée. Donc, je veux pouvoir afficher les users qui ont, par exemple, une pause et une tâche, juste une tâche et juste une pause.
Ca fonctionne bien, mis à part le fait qu'il me donne les noms des users qui n'ont ni de tâche, ni de pause et j'aimerais pouvoir éviter ça.

J'avoue ne pas trop savoir comment faire. J'ai essayé de modifier ma requête en faisant tout ce qui me passait par la tête, mais soit il me donne tout, soit il ne me donne que les personnes qui ont à la fois des tâches et des pauses à effectuer.

Si quelqu'un comprend ma question (que j'ai du mal d'expliquer lol), est-ce qu'il voudrait jeter un oeil sur ma requête svp ?

Merci d'avance
LA GLOBULE
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
Le problème des jointures externes, c'est justement qu'elles retournent tous les utilisateurs même si ils n'ont pas de taches ou de pauses.
C'est le but d'une jointure externe.

J'avoue ne pas avoir trop réfléchi à ton problème, mais une solution possible est de filtrer les résultats avec PHP, ou alors de le faire avec deux réquetes SQL.
InTheMix
InTheMix
Déconnecté
Hello La GLOBULLE,

Merci pour ta réponse.
C'est vrai que ma question était un peu stupide.

Sinon, pour filtrer en PHP, ca devrait être assez simple puisque je récupère les données dans un tableau, il suffit que je test :

  1.  
  2. for($i=0;$i<sizeof($totaltab);$i++)
  3. {
  4. if(!empty($totaltab[$i][id_pause]) || !empty($totaltab[$i][id_task]))
  5. {
  6. // blablabla
  7. }
  8. }
  9.  


Merci encore et bonne journée
LupusMic
LupusMic
Déconnecté
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Union est ton ami dans ce cas !

Pour en revenir à ta requête SQL initiale, plusieurs précisions.

Le mot clé outer est inutile (left join se suffit).

Un left join ne doit être utilisé que lorsque nécessaire. C'est à dire lorsqu'il y a une relation n..0 entre deux tables, et que la table jointe n'est pas une condition de sélection, mais un ajout fonctionnel.

En d'autres termes, si tu écris : « je veux tout les utilisateurs avec leurs rendez-vous », tu fais un left join. Si a contrario tu écris « Je veux tout les utilisateurs qui ont un rendez-vous », tu fais un join normal.

Une fois qu'on a compris, c'est limpide. Mais il est vrai que ce n'est pas évident. Et la culture du monde PHP ne pousse pas à ce genre de requêtes propres (car MySQL a (avait ?) de grosses limites fonctionnelles et des performances désastreuses lorsqu'on l'utilise comme une base de données relationnelle avancée (je pense aux requêtes imbriquées, entre autres).
InTheMix
InTheMix
Déconnecté
Hello LupusMic

Merci beaucoup pour tes précisions, ca va m'aider pour cette requête et pour l'avenir :)

Merci encore et bonne journée :)
Répondre
Accès rapide :

Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Bretagne - php - Moto