Mysql 通过一个特定字段连接3个表

Mysql 通过一个特定字段连接3个表,mysql,sql,join,Mysql,Sql,Join,我有以下结构的三张表: 1.table - product_name: product_id (unique) product_name (...) 2. table - pro product_id pro (...) 3. table - con product_id con (...) 我们的想法是,每一种产品都可以有无限多的优点和缺点 现在我的目标是有一个查询,当一个特定的产品有3-3个优点和缺点时,它将返回6行。3,con列为空,pro列为值,反之亦然 我尝试了一些方法,最接近

我有以下结构的三张表:

1.table - product_name:

product_id (unique)
product_name
(...)

2. table - pro
product_id
pro
(...)

3. table - con
product_id
con
(...)
我们的想法是,每一种产品都可以有无限多的优点和缺点

现在我的目标是有一个查询,当一个特定的产品有3-3个优点和缺点时,它将返回6行。3,con列为空,pro列为值,反之亦然

我尝试了一些方法,最接近解决方案的是:

SELECT * FROM product_name pn 
 JOIN pro p on pn.product_id = p.product_id 
 JOIN con c on pn.product_id = c.product_id 
WHERE pn.id = 1
现在这个查询将返回9行,而不是6行。它返回所有3个pro-s正好3次,并附加到每个cons。我得到的是:

1   Razor EcoSmart Metro HD electric scooter    Pro - 1 Con - 1 
1   Razor EcoSmart Metro HD electric scooter    Pro - 1 Con - 2 
1   Razor EcoSmart Metro HD electric scooter    Pro - 1 Con - 3 
1   Razor EcoSmart Metro HD electric scooter    Pro - 2 Con - 1 
1   Razor EcoSmart Metro HD electric scooter    Pro - 2 Con - 2 
1   Razor EcoSmart Metro HD electric scooter    Pro - 2 Con - 3 
1   Razor EcoSmart Metro HD electric scooter    Pro - 3 Con - 1 
1   Razor EcoSmart Metro HD electric scooter    Pro - 3 Con - 2 
1   Razor EcoSmart Metro HD electric scooter    Pro - 3 Con - 3 
我想要的是:

1   Razor EcoSmart Metro HD electric scooter    Pro - 1 NULL
1   Razor EcoSmart Metro HD electric scooter    Pro - 2 NULL    
1   Razor EcoSmart Metro HD electric scooter    Pro - 3 NULL    
1   Razor EcoSmart Metro HD electric scooter    NULL    Con - 1 
1   Razor EcoSmart Metro HD electric scooter    NULL    Con - 2 
1   Razor EcoSmart Metro HD electric scooter    NULL    Con - 3
我试着按组和按组进行处理,但仍然无法使其工作。我想他们无论如何都不是解决办法


我缺少什么?

我建议只在一个表中存储优点和缺点。这将大大简化这一过程

但是,您可以使用
UNION ALL

SELECT *
FROM product_name pn LEFT JOIN
     ((SELECT p.product_id, p.pro, null as con
       FROM pros p
      ) UNION ALL
      (SELECT c.product_id, null as pro, con
       FROM cons c
      )
     ) pc
     USING (product_id);

注意:您可以在子查询中包含更多列。您只需要从两个表中包含它们。

向我们展示一些示例表数据和预期结果-以格式化文本的形式呈现,而不是以图像(或图像链接)的形式呈现。@jarlh我相应地编辑了我的问题,希望它能澄清。谢谢谢谢-此查询抛出一个错误,指出“from子句”中的“product_id”列无效。知道为什么吗?你是对的,在同一张表中列出优点和缺点将简化这一过程,我甚至正在考虑相应地重新构建我的整个数据库(我正处于开发的早期阶段,所以这很容易)-但现在,在我弄明白这一点之前,我不会放弃这件事。虽然基于您的解决方案,它不一定是初学者的东西。@zsoltbala。对我最初在子查询中使用
select*
编写查询。然后我列出了列,但遗漏了用于连接的列。