Получение дополнительных данных из таблицы соединений

0

Итак, у меня есть эта структура

ПРОДУКТЫ

* PRODUCT_ID (primary key)
* PRODUCT_NAME

РУБРИКИ

* CATEGORY_ID (primary key)
* CATEGORY_NAME
* CODE

PRODUCT_CATEGORIES_MAP

* PRODUCT_ID (primary key, foreign key to PRODUCTS)
* CATEGORY_ID (primary key, foreign key to CATEGORIES)
* QUANTITY

Я использую этот запрос

SELECT * FROM `products`
where id in (
    SELECT `product_id`
    FROM `categorizations`
    WHERE category_id = (
        SELECT id
        FROM `categories`
        where code = 'something'))

это отлично работает, но я просто получаю список продуктов. Мне нужно количество каждого из них в таблице соединений

Теги:

5 ответов

3
Лучший ответ

Имена таблиц в вашем объяснении отличаются от ваших примерных запросов. Я использовал те из вашего запроса.

SELECT p.product_id  ,
       p.product_name,
       pc.quantity
FROM   `products` p
       JOIN `categorizations` pc
       ON     p.id = pc.`product_id`
       JOIN `categories` c
       ON     c.id = pc.category_id
WHERE  c.code      = 'something'
  • 0
    вот как бы выглядело мое, если бы я вспомнил, как работали соединения: P
  • 0
    +1 это то, что я бы тоже использовал, за исключением того, что я использовал бы ЛЕВЫЕ СОЕДИНЕНИЯ вместо обычных СОЕДИНЕНИЙ, поэтому запрос будет возвращать даже продукты, которые, например, не относятся к какой-либо категории.
Показать ещё 2 комментария
2

sql немного ржавый, но здесь идет

выберите PRODUCT_ID, PRODUCT_NAME, КОЛИЧЕСТВО
от ПРОДУКТОВ как A, PRODUCTS_CATEGORIES_MAP as B, КАТЕГОРИИ as C
где A.PRODUCT_ID = B.PRODUCT_ID
и C.CATEGORY_ID = B.CATEGORY_ID
и C.CODE = 'something'

1

Вы можете рассчитывать на количество в случае, если продукт находится в большем количестве категорий.

select p.*, 
       sum(m.quantity) quantity
  from products p
  join categorizations m on m.product_id = p.product_id
  join categories on c.category_id = m.category_id 
   and c.code = 'something'
 group by p.product_id

В противном случае посмотрите код @Martin

0

Детали, которые вы хотите, это количество продукта, и поэтому не начинайте с них... вы всегда можете получить продукты, потому что у вас есть product_id.

SELECT * FROM (SELECT `product_id`, `quantity`
    FROM `categorizations`
    WHERE category_id = (
        SELECT id
        FROM `categories`
        where code = 'something'))) AS `filtered_categorization`
LEFT JOIN `products`
    ON (`products`.`id` == `filtered_categorization`.`product`);
0

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

select
 p.*,
 c.category_id,
 c.category_name,
 pcm.quantity
from
 products p
inner join product_categories_map pcm on p.product_id = pcm.product_id
inner join categories c on pcm.category_id = c.category_id
where
 c.code = 'something'
order by
 p.product_id, c.category_id;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню