LEFT JOIN с большим количеством полей в правой таблице - PullRequest
1 голос
/ 28 августа 2009

У меня проблема! Таблица «Мои магазины» содержит 4 строки, каждая из которых содержит название магазина, идентификатор и другие данные, относящиеся к этому магазину.

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

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 голосов
/ 28 августа 2009

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

Измените ЛЕВОЕ СОЕДИНЕНИЕ на ВНУТРЕННЕЕ СОЕДИНЕНИЕ, чтобы показывать только магазины, по крайней мере, с одной категорией.

0 голосов
/ 28 августа 2009

Хм. Возможно, вы имеете в виду:

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 голосов
/ 28 августа 2009

После того, как сообщение было обновлено. Вы хотите следующее.

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 голосов
/ 28 августа 2009

попробуйте это:

SELECT S.* , B.categoryId as bindCategory
FROM shops S
   LEFT JOIN bind_shop_category B
       ON B.shopId = S.shopId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...