Sql 从联接表获取额外数据
好的,我有这个结构 产品Sql 从联接表获取额外数据,sql,mysql,Sql,Mysql,好的,我有这个结构 产品 * PRODUCT_ID (primary key) * PRODUCT_NAME 类别 * CATEGORY_ID (primary key) * CATEGORY_NAME * CODE 产品类别图 * PRODUCT_ID (primary key, foreign key to PRODUCTS) * CATEGORY_ID (primary key, foreign key to CATEGORIES) * QUANTITY 我正在使用这个查询 SELE
* PRODUCT_ID (primary key)
* PRODUCT_NAME
类别
* CATEGORY_ID (primary key)
* CATEGORY_NAME
* CODE
产品类别图
* 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'))
这很好,但我只是得到一个产品清单。我需要联接表中每一个的数量,sql有点生疏了,但这里是 选择产品标识、产品名称、数量
从A为产品,B为产品\类别\映射,C为类别
其中A.PRODUCT\u ID=B.PRODUCT\u ID
C.类别ID=B.类别ID
C.CODE='something'sql有点生疏,但这里是 选择产品标识、产品名称、数量
从A为产品,B为产品\类别\映射,C为类别
其中A.PRODUCT\u ID=B.PRODUCT\u ID
C.类别ID=B.类别ID
C.CODE='something'说明中的表名与示例查询中的表名不同。我用了你查询的那些
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'
解释中的表名与示例查询中的表名不同。我用了你查询的那些
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'
你想要的细节是产品的数量,因此,为什么不从它们开始……你总是可以检索产品,因为你有产品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`);
你想要的细节是产品的数量,因此,为什么不从它们开始……你总是可以检索产品,因为你有产品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`);
若产品属于更多类别,您可能需要对数量进行合计
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 code,如果产品属于更多类别,您可能需要对数量进行合计
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 code试试这个
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;
试试这个
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;
+1这也是我要使用的,只是我会使用左连接而不是普通连接,因此查询甚至会返回未分配给类别的产品,例如。@Freek-但这不是OP原始查询的语义。这样做的目的似乎只是为了带回与类别代码相匹配的产品!如果一个产品没有被分配到一个类别,那么它首先就不会有一个要匹配的类别代码。搞砸了-工作到很晚的“好处”之一:)+1这也是我会使用的,除了我会使用左连接而不是普通连接,因此查询甚至会返回未分配到类别的产品,例如。@Freek-但这不是OP原始查询的语义。这样做的目的似乎只是为了带回与类别代码相匹配的产品!如果一个产品没有被分配到一个类别,那么它首先就不会有一个要匹配的类别代码。搞砸了——加班的“好处”之一:)