2009-08-28 73 views
1

我遇到問題了! 我的商店表格包含4行,每行都包含商店名稱,ID和與該商店相關的其他數據。在右表中加入更多字段

我也有一個「綁定」表,我選擇哪些產品類別應在哪些商店中可見。自然,綁定表將包含更多行...我想從商店表中選擇所有商店,並且只加入右表中綁定表的行(如果商店ID相同)。

SELECT * , b.categoryId as bindCategory 
FROM shops 

LEFT JOIN bind_shop_category AS b 
ON shops.shopId = b.shopId 

如果我那樣做,我得到的所有結合,與它們對應的店鋪數據,而不僅僅是商店及其相應的數據綁定。 :P

這很混亂,我不確定我是否提出了100%的問題。

呃... ...預計數據:

shopId   shopName   bind.categoryId 
    1    shop1 
    2    shop2   category1 
    3    shop3   category1 
    4    shop4 

回答

0

試試這個:

SELECT S.* , B.categoryId as bindCategory 
FROM shops S 
    LEFT JOIN bind_shop_category B 
     ON B.shopId = S.shopId 
+0

上述b和B引用是衝突還是不區分大小寫? – JYelton 2009-08-28 14:56:07

+0

在大多數數據庫中不區分大小寫,但編輯爲更正 – 2009-08-28 14:57:27

0

嗯。也許你的意思是:

SELECT shops.*, b.categoryId as bindCategory 
FROM shops 
LEFT JOIN bind_shop_category AS b 
ON shops.shopId = b.shopId 

(或者,途中我會寫吧:)

SELECT shops.*, b.categoryId as bindCategory 
FROM shops 
LEFT JOIN bind_shop_category AS b 
USING (shopId) 
0

後進行了更新後。你想要以下。

SELECT s.ShopId, s.ShopName , b.categoryId as bindCategory 
FROM shops 
    LEFT OUTER JOIN bind_shop_category AS b 
     ON (shops.shopId = b.shopId) 
ORDER BY s.ShopId 
0

如果你想簡單地列出所有類別中單列每家店鋪,您可以使用GROUP_CONCAT

SELECT s.shopId, s.shopName, GROUP_CONCAT(b.categoryId) 
FROM shops s 
LEFT JOIN bind_shop_category AS b ON (s.shopId = b.shopId) 
GROUP BY s.shopId 

輸出會是這樣的......

1    shop1   NULL 
2    shop2   category1,category2 
3    shop3   category1 

將LEFT JOIN更改爲INNER JOIN以僅顯示至少有一個類別的商店。