2016-05-17 74 views
2

我正在运行MySQL 5.1.71。在我的数据库中有三个表格 - 加载,黄铜和制造加载是我的“主”表。我的目标是查询加载并在结果中包含mfg.name。我已经尝试了JOIN子句和子查询的各种迭代,这些子查询都带有和不带有WHERE子句。看来这应该是相当微不足道的,所以我不知道我不能达到解决方案。SQL Join和Sub-query

load 
------------------------- 
| id | desc | brass_id | 
------------------------- 
| 1 | One |  2 | 
| 2 | Two |  1 | 
------------------------- 

brass 
--------------- 
| id | mfg_id | 
--------------- 
| 1 |  6 | 
| 2 |  8 | 
--------------- 

brass_mfg 
------------------------ 
| id | name   | 
------------------------ 
| 6 | This Company | 
| 8 | That Company | 
------------------------ 

我想要的结果会是...

results 
--------------------------- 
| load | mfg    | 
--------------------------- 
| One | That Company | 
| Two | This Company | 
--------------------------- 
  • 负载ID将永远只有一个黄铜ID
  • 黄铜ID永远只有一个MFG ID



ED IT
以前提供的样品数据(上面)已更新。此外,下面是我正在运行的查询和我得到的结果。该公司在每个返回的记录中都是错误的。我在查询和结果中包含了表中的ID。出现的公司名称不是生产制造商表中的ID的名称。

SELECT 
    load.id AS "load.id", 
    load.brass_id AS "load.brass_id", 
    brass.id AS "brass.id", 
    brass.mfg_id AS "brass.mfg_id", 
    brass_mfg.id AS "brass_mfg.id", 
    brass_mfg.name AS "brass_mfg.name" 
FROM `load` 
LEFT JOIN brass ON load.brass_id = brass.id 
LEFT JOIN brass_mfg ON brass.id = brass_mfg.id 


----------------------------------------------------------------------------------------- 
| load.id | load.brass_id | brass.id | brass.mfg_id | brass_mfg.id | brass_mfg.name  | 
----------------------------------------------------------------------------------------- 
| 1  | 2    | 2  | 6   | 2   | Wrong Company  | 
| 2  | 1    | 1  | 8   | 1   | Incorrect Company | 
----------------------------------------------------------------------------------------- 
+3

联接是SQL查询的基本构建块。他们应该是你的第一选择。要优化,请查看索引。 – MatBailie

+0

我真的在这里看不到问题。 – Strawberry

+0

值得一提的是,您所期望的结果看起来像是假定每个'product'都有一个'mfg',但关联表--''''通常用于多对多的关系中......请注意! – Darek

回答

2

看看你的表格,看看涉及到一个什么样的数据的另一个然后建立由表连接表来获得所需输出。

SELECT p.desc AS Product, m.name AS mfg 
FROM product p 
INNER JOIN lot l ON p.lot_id = l.id 
INNER JOIN mfg m ON l.mfg_id = m.id 
+0

问题是正确的连接类型和正确的左右表的组合。特别是你最后一次加入是让我变得直截了当的。谢谢一堆。 – user1801810

0

您的联接查询中有错误。 试试这个:

Select 
l.id AS "load.id", 
l.brass_id AS "load.brass_id", 
b.id AS "brass.id", 
b.mfg_id AS "brass.mfg_id", 
m.id AS "brass_mfg.id", 
m.`name` AS "brass_mfg.name" 
FROM `load` as l 
LEFT JOIN brass as b ON l.brass_id = b.id 
LEFT JOIN brass_mfg as m ON b.mfg_id = m.id 

enter image description here

需要LEFT JOIN

+0

'LEFT JOIN'是我接近的最接近的,但是我收到了糟糕的结果。将其他信息放在一起编辑到原始文章中。 – user1801810

+0

我觉得'LEFT JOIN'是你设计的最好方法,如果你有一些不好的结果,你可能会把它们放在里面,这样我们可以帮你。 – wajeeh

+0

更新了原始文章以反映更多真实数据,增加了查询和结果。 – user1801810

0

如果是单 - 单的关系,为什么有中间表? 在你的情况下,最好的情况是简单的加入。

SELECT pt.desc as Product, mfg.name as Mfs 
FROM Product pt 
Join Lot lt on lt.id = pt.lot_id 
Join Mfg mf on mf.id = lt.mfg_id 
+0

给定的产品只有一个批次,因此只有一个制造商。但是,可能有多个产品指向同一批次。此外,每个表格中都有各种各样的字段,这些字段必须将表格拆分为它们。 – user1801810