2009-08-28 3 views
1

У меня проблема! Таблица моих магазинов содержит 4 строки, каждая из которых содержит имя магазина, идентификатор и другие данные, относящиеся к этому магазину.LEFT JOIN с большим количеством полей в правом столе

У меня также есть таблица «bind», где я выбираю, какие категории продуктов должны быть видны в магазинах. Естественно, таблица привязки будет содержать больше строк ... Я бы хотел выбрать все магазины из таблицы магазинов и объединить только строки в правой таблице таблицы привязки, если идентификатор магазина совпадает.

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

+0

не чувствителен к регистру в большинстве БД, но отредактирован для исправления –

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, чтобы показывать только магазины по меньшей мере с одной категорией.

Смежные вопросы