2008-11-18 5 views
3

Simplifié par exemple, j'ai deux tables, groups et items.Comment utiliser une jointure pour interroger deux tables et obtenir toutes les lignes d'une table et les lignes connexes de l'autre?

items (
    id, 
    groupId, 
    title 
) 

groups (
    id, 
    groupTitle, 
    externalURL 
) 

La requête régulière que je suis va quelque chose comme ceci:

SELECT 
    i.`id`, 
    i.`title`, 
    g.`id` as 'groupId', 
    g.`groupTitle`, 
    g.`externalURL` 
FROM 
    items i INNER JOIN groups g ON (i.`groupId` = g.`id`) 

Cependant, je dois modifier maintenant, parce que tous les groupes qui spécifient un externalURL aura pas de dossiers correspondants dans le items table (puisqu'ils sont stockés en externe). Est-il possible de faire une sorte de rejoindre pour que la sortie ressemble un peu à ceci:

items: 
id title groupId 
---------------------- 
1  Item 1 1 
2  Item 2 1 

groups 
id groupTitle externalURL 
------------------------------- 
1  Group 1  NULL 
2  Group 2  something 
3  Group 3  NULL 

Query output: 
id title groupId groupTitle externalURL 
--------------------------------------------------- 
1  Item 1 1   Group 1  NULL 
2  Item 2 1   Group 1  NULL 
NULL NULL  2   Group 2  something 

-- note that group 3 didn't show up because it had no items OR externalURL 

Est-ce possible dans une requête SQL?

Répondre

11

C'est exactement ce à quoi sert une jointure externe: renvoyez toutes les lignes d'une table, qu'il y ait ou non une ligne correspondante dans l'autre table. Dans ce cas, renvoyez NULL pour toutes les colonnes de l'autre table.

L'autre condition que vous pouvez prendre en charge dans la clause WHERE.

SELECT 
    i.`id`, 
    i.`title`, 
    g.`id` as 'groupId', 
    g.`groupTitle`, 
    g.`externalURL` 
FROM 
    items i RIGHT OUTER JOIN groups g ON (i.`groupId` = g.`id`) 
WHERE i.`id` IS NOT NULL OR g.`externalURL` IS NOT NULL; 

Seulement si les deux i.id et g.externalURL sont NULL, toute la ligne de l'ensemble de résultats joint doivent être exclus.

+1

Je suppose que j'aurais dû écouter plus dans les bases de données 101, hey? À votre santé. – nickf

Questions connexes