如何从一个表返回所有行并从另一个表返回值,如果不存在则返回0?

时间:2013-03-04 17:14:30

标签: mysql

我的数据库中有两个表:

表1:购买物品

Item | Qnt | Rate |Total
Meat | 1   | 20   | 20
Fish | 0.5 | 30   | 15
Chicken|1  | 25   | 25
Meat | 2   | 20   | 40


Table2: Trading Price
Item |      Datetime       | Price
Meat | 2013-02-20 10:00:00 | 20
Meat | 2013-02-20 09:00:00 | 18
Meat | 2013-02-19 08:00:00 | 21
Fish | 2013-02-19 09:00:00 | 15
Fish | 2013-02-19 08:00:00 | 17
Chicken|2013-02-20 09:00:00|26
Chicken|2013-02-20 08:00:00|25

表1列出了每个小时购买的物品和表2的更新以及每个物品的当前价格。因此,从表2中可以清楚地看到,肉类最后一次交易时间是2013年2月20日上午10点,而鱼类没有在同一天进行交易,而是在2013年2月19日早上9点进行交易而鸡肉交易时间为2013年2月20日上午9点。我想做什么,列出表1中的所有项目,并加入表2中相应项目的最后交易价格,这将是这样的:

Output:
Item | Qty | Total | Last Trade Price
Meat | 1   | 20    | 20
Meat | 2   | 40    | 20
Fish | 0.5 |15     | 15
Chicken|1  |25     |26

这里应该使用什么类型的连接和什么子句来获得理想的输出? 我试过这个查询: SELECT p.Item,p.Qnt l.price FROM Table1 as p INNER JOIN Table2 as l ON p.Item = l.Item WHERE l.Datetime =(SELECT max(Datetime)FROM Table2); 但是通过这个查询我没有找到所需的结果,因为每个项目的最大日期时间不相同,这就是输出中缺少项目的原因。

那么什么连接类型和什么条件应该在WHERE子句中应用以获得上述输出?

1 个答案:

答案 0 :(得分:0)

尝试此查询:

SELECT p.Item, p.Qnt, LatestPriceTable.price FROM Table1 as p 

INNER JOIN

(SELECT Table2.Item, Table2.Price FROM Table2 INNER JOIN
(SELECT Item, MAX(DateTime) FROM Table2
GROUP BY Item) AS A ON Table2.Item = A.Item) AS LatestPriceTable

ON p.Item=LatestPriceTable.Item

最内层的查询SELECT Item, MAX(DateTime) FROM Table2 GROUP BY Item将为每个DateTime输出最新的Item。我们将此结果称为A.现在,我们使用Table2加入A,以获取最新日期的Price列值。结果表名为LatestPriceTable,仅包含项目名称和最新价格。现在,您只需将其与Table1连接即可进行计算。

我确实感觉你设计的系统可能不足以满足你想要实现的目标。它是一种库存类型的应用程序吗?我看到的问题是,您总是将当前库存量与最新市场价格相乘。实际上,该股票几乎总是包含不同日期和不同价格的购买。

但话又说回来,我不确定你的确切目的,所以也许你可以忍受你正在做的事情。