LEFT JOIN右表中包含更多字段

时间:2009-08-28 14:50:13

标签: mysql

我有问题! 我的商店表包含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

4 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分: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)

答案 2 :(得分: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

答案 3 :(得分: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,仅显示至少有一个类别的商店。