2011-12-06 7 views
1

J'ai une base de données avec des visites guidées (tours de ville en groupe avec guide). Ce dont j'ai besoin, c'est d'une requête SQL (pour une base de données mysql 5.1.54) qui finira par me donner un tableau PHP avec les informations de plusieurs tables combinées. Je suis capable d'accomplir ceci en faisant une requête juste pour les 3 premières tables et en ajoutant ensuite les informations dans les tables 4 et 5 dans une boucle foreach.Requête SQL pour plusieurs tables (un-à-plusieurs) dans la base de données mysql

Mais, j'ai besoin d'utiliser la requête pour la recherche/filtrage (comme: montrer toutes les réservations où le partenaire a l'ID 9), donc j'ai besoin de SQL pour sélectionner les réservations correspondantes.

  1. Les réservations sans partenaires (tableau 4) et/ou guides (tableau 5) doivent être incluses.
  2. Tous les partenaires et les guides doivent être inclus dans le résultat (la réservation peut avoir plus de partenaires/guides)
  3. Toutes les informations dans les tableaux 4 et 5 doivent être incluses (comme le statut du tableau 4).

Une version simplifiée de la base de données:

Tableau 1: réservations:

id id_client id_tour 
1  22   6 
2  23   5 

Tableau 2: clients (une réservation a un client):

id name 
22 John 
23 William 

Tableau 3: visites (une réservation a une tournée)

id name 
5  big tour 
6  small tour  

Tableau 4: partenaires (une réservation peut avoir plusieurs partenaires):

id id_reservation id_partner_type id_partner status 
34 1     9     16   1 
35 1     9     17   0 

Tableau 5: guides (une réservation peut avoir guides multiples):

id id_reservation id_guide 
18 1     14 
19 1     15 

J'ai essayé de nous en sortir mais je c ne pas obtenir une requête qui fait le travail. J'ai utilisé GROUP_CONCAT pour obtenir les numéros de partenaires et de guides multiples. Le plus gros problème est de ne pas pouvoir inclure les réservations qui n'ont pas de partenaires et/ou de guides comme la réservation 2.

Répondre

0

Pour inclure toutes les réservations qui n'ont pas de partenaires et de guides, vous devez utiliser OUTER JOINs, par exemple la requête suivante vous donne toutes les informations de vos tables 4, 5 y compris votre état:

Select p.*, g.* 
from reservations r 
left outer join partners p on p.id_reservation = r.id 
left outer join guides g on g.id_reservation = r.id 
where p.id_reservation is null and g.id_reservation is null 
Questions connexes