多表数据的MySQL查询

多表数据的MySQL查询,mysql,Mysql,我想,我正在MySQL中寻找一个听起来不太复杂的问题的解决方案 基本上我想用两张桌子。 第一个包含一个电子组件列表,如 ID Description Value AdditonalInfo 1 Resistor 1.0R R0402 2 Capacitor 100nF C0805 3 Capacitor 10nF C0603 ... 我想将有关采购的信息存储在第二个表中 ID Component Manufacturer Partnum

我想,我正在MySQL中寻找一个听起来不太复杂的问题的解决方案

基本上我想用两张桌子。 第一个包含一个电子组件列表,如

ID  Description  Value  AdditonalInfo
 1  Resistor     1.0R   R0402
 2  Capacitor    100nF  C0805
 3  Capacitor    10nF   C0603
 ...
我想将有关采购的信息存储在第二个表中

ID  Component    Manufacturer Partnumber  Timestamp
 1  2            TDK          XXXYYYZZZ   5
 2  2            Kemet        AAABBBCCC   10
 3  1            Multicomp    111222333   3
 ...
如您所见,应该可以为每个组件添加多个制造商

现在,我想生成一个表(视图),其中应该包含 所有部件信息以及制造商的最新条目(如有)

对于给定的示例,这将是

ID  Description  Value  AdditonalInfo Manufacturer Partnumber
 1  Resistor     1.0R   R0402         Multicomp    111222333
 2  Capacitor    100nF  C0805         Kemet        AAABBBCCC
 3  Capacitor    10nF   C0603         (NULL)
在单个查询中是否可以实现这一点?或者至少通过某种查询 生成最终表?我不知道JOIN命令是否会这样做

我将感谢任何帮助或提示,以找到解决这个问题的方法。 谢谢

请您尝试以下方法:

SELECT * FROM table1 LEFT JOIN table2 on table1.id = table2.id

如果组件列上有索引,则可以使用带联接的查询获取数据:

SELECT 
* 
FROM components 
  INNER JOIN store USING(id)

这个查询足够了,您不需要存储冗余数据。

下面的查询应该会给出您想要的信息

它获取所有
组件
,然后针对每个组件显示子查询中与
寻源
表匹配的条目,该表按最新条目对组件进行分组

子查询基于组件和max(时间戳)连接到另一个寻源表副本,以获取所需的剩余信息

SELECT a.ID, a.Description, a.Value, a.AdditonalInfo, 
         c.Manufacturer, c.Partnumber
FROM componentTable a
LEFT JOIN ( SELECT component, max(timestamp) AS maxTime
            FROM sourcingTable
            GROUP BY component
       ) b
  ON  a.id = b.component
INNER JOIN sourcingTable c
  ON  b.component = c.component
  AND b.maxTime   = c.timestamp

您可能需要在
左联接
内部联接
部分周围添加括号,但请先尝试一下,如果不起作用请告诉我

我可以在一个查询中生成此表,但性能可能不太好。可以吗?如果是这样,请添加您的DML和DDL查询。
OUTER JOIN
plus
groupby
component
HAVING Timestamp=max(Timestamp)
对于左JOIN,它可以部分工作。但是,如果一个组件有多个制造商条目,我将为该组件获取多行。如果是这样的话,我只想用最新的制造商条目为每个组件获取一行。@Timoklingberg您能解释一下什么部分不工作,以及您没有看到哪些结果是您期望看到的吗?这将有助于理解答案中可能出现的错误是的,谢谢。如果在查询的第二行中用c.*替换b.Manufacturer和b.Partnumber,这似乎可以正常工作。