2010-07-27 39 views
-1

我得到了一个快速mysql查询的技能测试。我给出的表格:艰难的Mysql查询

Orders     OrderItems 
----------------------------------------     
    id       id 
    date      order_id(Orders.id) 
    shipping_amount   product_id 
    order_status    price 
    customer_id    quantity 

我需要显示订单ID和总数(包括运输量)和记录之前的6月1日,2003年

输出应该是...

| OrderID | OrderTotal | 
+-----------+------------+ 
| 13230  | $55.00  | 
| 54455  | $40.00  | 
| 59694  | $33.04  | 
| 39495  | $21.05  | 

提示是使用Group by或subselect。到目前为止我有以下陈述,但不知道接下来要做什么。

Select id AS OrderId,***(not sure what to do here) 
from Orders join OrderItems on Orders.id=OrderItems.id 
+0

所掌握的技术在这里被测试? – recursive 2010-07-27 01:13:54

+0

为什么不显示如何获得所有订单总计,因此每个订单ID将有多个总计。然后,一旦你显示出来,它可能会更有意义,以帮助指导你,但是,你有没有阅读mysql手册上的选择语句?毕竟这是一个考验。 – 2010-07-27 01:18:15

+0

我明白测试是测试。我经常写mysql查询,但我没有机会处理这种复杂的查询。我希望在这个问题上得到一些提示。感谢您的建议,尽管...我一定会阅读手册 – FatDeveloper 2010-07-27 01:25:02

回答

4

我没有访问mysql数据库进行测试,但我想它看起来是这样的:

select 
    o.id OrderID, 
(select sum(oi.price * oi.quantity) from order_items oi where oi.order_id = o.id) + o.shipping_amount OrderTotal 
from 
    orders o 
where 
    o.date < str_to_date('2003-06-01', '%Y-%m-%d'); 
+0

MySQL日期恰好接受YYYY-MM-DD,因此您不必担心解析它。 – Charles 2010-07-27 01:32:28

+1

@Charles:你不能认为这是别人使用的格式 - 显式转换为DATE/DATETIME/TIMESTAMP是最安全的方法。 +1,Brandon – 2010-07-27 01:42:02

+0

OKay,在这个*特定的情况下,你不需要担心解析它。 :) – Charles 2010-07-27 02:13:47

2

我会说这一定是这样的:

SELECT O.ID as OrderID, SUM(OI.price * OI.quantity) AS OrderTotal 

FROM Orders O 

INNER JOIN OrderItems OI ON O.id = OI.order_Id 

WHERE date < '2003-06-01' 

GROUP BY O.id 

ORDER BY SUM(price * quantity) DESC 

不知道如何在MySQL虽然格式化日期,或者您可以通过在此版本的agregate功能订单,但我敢肯定这是一个好的开始。

+0

+1:假设OP要查看ordertotal为零的订单,请将INNER JOIN更改为LEFT JOIN,并使用COALESCE将NULL更改为零。 – 2010-07-27 01:44:16

+0

谢谢David ... Reallyl对我很好... – FatDeveloper 2010-07-27 02:35:40

+0

一旦你做了几个查询,它会变得更容易:) – 2010-07-27 12:14:56