Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从联接表获取额外数据_Sql_Mysql - Fatal编程技术网

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原始查询的语义。这样做的目的似乎只是为了带回与类别代码相匹配的产品!如果一个产品没有被分配到一个类别,那么它首先就不会有一个要匹配的类别代码。搞砸了——加班的“好处”之一:)