2013-09-06 7 views
2

Je les tableaux ci-dessous (colonnes non liées à l'écart):SQL n: m relation

studios: 
id | user_id 
1 |  1 
2 |  1 

equipment: 
id 
1 
2 

studio_equipment: 
id | studio_id | equipment_id 
1 |   1 |   1 
2 |   1 |   1 

Je "studios" et "équipements". Un studio appartient à un utilisateur. L'équipement peut être affecté aux studios (table studio_equipment). Un équipement peut être assigné plusieurs fois à un studio mais il peut aussi y avoir des studios qui n'ont pas encore d'équipement. Je veux récupérer tous les studios pour un certain utilisateur avec tout l'équipement possible qui pourrait être assigné à ces studios. Si un équipement a déjà été assigné à un studio, montrez-le également.

Pour l'exemple ci-dessus cela signifierait la suivante (pour user_id 1):

desired results: 
studio.id | equipment.id | studio_equipment.id 
     1 |   1 |     1 
     1 |   1 |     2 
     1 |   2 |    null 
     2 |   1 |    null 
     2 |   2 |    null 

Ceci est mon instruction SQL jusqu'ici:

SELECT `s`.*, `e`.*, `se`.* 
FROM (`studios` AS s) 
LEFT JOIN `studio_equipment` AS se ON `s`.`id`=`se`.`studio_id` 
LEFT OUTER JOIN `equipment` AS e ON `se`.`equipment_id`=`e`.`id` 
WHERE `s`.`user_id` = '1' 

Mais cela ne récupère pas toutes les données i vouloir. Par exemple, le studio 2 est récupéré mais pas associé à tout l'équipement possible.

Merci d'avance pour votre aide!

+1

Voici l'information dont vous avez besoin: http://stackoverflow.com/questions/219716/what-are-the-uses-for-cross-join – dcaswell

Répondre

1
SELECT 
    s.id AS studio_id, 
    e.id AS equipment_id, 
    se.id AS studio_equipment_id 
FROM 
    studios AS s 
    CROSS JOIN 
    equipment AS e 
    LEFT JOIN 
    studio_equipment AS se 
     ON se.studio_id = s.id 
     AND se.equipment_id = e.id ;