2008-11-18 57 views
3

簡化例如,我有兩個表,groupsitems如何使用連接查詢兩個表並從一個表中獲取所有行,並從另一個表中獲取相關行?

items (
    id, 
    groupId, 
    title 
) 

groups (
    id, 
    groupTitle, 
    externalURL 
) 

定期查詢我是這樣的:

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`) 

不過,我現在需要修改這一點,因爲所有這些指定externalURL不會有在items任何相應的記錄組表(因爲它們存儲在外部)。是否有可能做某種加入,以便輸出看起來有點像這樣:

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 

這是可能的一個SQL查詢嗎?

回答

11

這正是外連接的用途:返回一個表中的所有行,而不管另一個表中是否存在匹配的行。在這些情況下,爲其他表的所有列返回NULL。

您可以在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; 

只有i.idg.externalURL是NULL,則合併後的結果集的整行應排除在外。

+1

我想我應該在數據庫101中聽更多,嘿?乾杯。 – nickf 2008-11-18 03:47:21

相關問題