【问题标题】:How to return all rows From one table and return value from another table, if not present return 0?如何从一个表返回所有行并从另一个表返回值,如果不存在则返回 0?
【发布时间】:2013-02-18 20:51:50
【问题描述】:

我的数据库中有两个表:

表 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 中可以清楚地看出,Meat 最后一次交易是在 2013 年 2 月 2013 日上午 10 点,而鱼不是在同一天交易,它是在 2013 年 2 月 19 日上午 9 点交易的,而鸡肉是在 2013 年 2 月 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 子句中应该应用什么连接类型和什么条件才能得到上述输出?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个查询:

    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 将为每个Item 输出最新的DateTime。我们将此结果称为 A。现在我们将 A 与 Table2 连接起来,以获取这些最新日期的 Price 列值。生成的表称为LatestPriceTable,将仅包含项目名称和最新价格。现在您可以简单地将它与 Table1 连接起来进行计算。

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

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

    【讨论】:

    • 能不能详细解释一下上面的代码?
    • 实际数据是股票市场价格表,但为了显示更简单的示例,我使用了肉类、鱼类等。虽然我试图用我的实际代码完成上述查询,但它并没有达到我想要的效果.无论如何,谢谢你的帮助。你能告诉我一个查询代码在哪里,我将像这样设置最新时间:SELECT p.Item, p.Qnt l.price FROM Table1 as p INNER JOIN Table2 as l ON p.Item=l.Item WHERE l。日期时间='2013-02-20 10:00:00'。如果与 l.Datetime 匹配,结果输出将显示 ltp,否则将显示 ltp=0;该怎么做?
    • 我使用了 IFNULL 和 COALESC 函数,但是这些都不起作用,所有生成的 ltp 在获取结果时都是空白的。
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多