2013-04-02 34 views
2

要构建报表,我必须选择一些关于所有客户的最后交易状态的信息。到现在为止,这是我的了:按ID分组具有最大值(日期字段)

SELECT c.firstname, c.lastname, d.product_name, o.payment, s.name, h.date_add 
FROM ps_orders o 
INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
INNER JOIN ps_order_history h ON o.id_order = h.id_order 
INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
WHERE s.id_lang =6 
GROUP BY c.id_customer 
HAVING MAX(h.date_add) 

对每一个客户,该查询选择的第一个日期(场h.date_add)当我需要的最后一个。 MySQL似乎无视HAVING

我试图做出一个子选择,但它不起作用。

谢谢任何​​答案。

+0

不应该是'有最大(...)的东西'像'> 1'或某种条件? – fedorqui

回答

4

在这里,您需要获取最新date_add的子查询,对于表ps_order_history上的每个id_order。然后将子查询的结果加回到原始表ps_order_history上,前提是它在两列上进行匹配:date_addid_order

SELECT c.firstname, 
     c.lastname, 
     d.product_name, 
     o.payment, 
     s.name, 
     h.date_add 
FROM ps_orders o 
     INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
     INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
     INNER JOIN ps_order_history h ON o.id_order = h.id_order 
     INNER JOIN 
     (
      SELECT id_order, MAX(date_add) max_date 
      FROM ps_order_history 
      GROUP BY id_order 
     ) x ON h.id_order = x.id_order AND 
       h.date_add = x.max_date 
     INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
WHERE s.id_lang =6 
GROUP BY c.id_customer 
+1

谢谢!它解决了。只要一点点修正: ... SELECT id_order,MAX(h.date_add)MAX_DATE FROM ps_order_history^h GROUP BY h.id_order –

+0

欢迎您':D' –

+0

哦,是的。 'h.'不应该在'MAX()'上。谢谢。 –

3

要获得的最后一天,你需要加入它:

SELECT c.firstname, c.lastname, d.product_name, o.payment, s.name, h.date_add 
FROM ps_orders o 
INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
INNER JOIN ps_order_history h ON o.id_order = h.id_order 
INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
inner join (select o.id_customer, max(oh.date_add) as maxdate from ps_order_history h join ps_order o on h.id_order = o.id_order group by o.id_customer) omax on omax.id_customer = o.id_customer and o.date_add = omax.maxdate 
WHERE s.id_lang =6 
GROUP BY c.id_customer 

你having子句计算最大日期,然后成功时,它不等于0(这将是最时间)。

+0

表** ps_order_history **没有字段** id_customer **。 ** ps_orders **有。我试图解决这个问题,但没有奏效: ... SELECT o.id_customer,MAX(h.date_add)AS的maxDate FROM ps_order_history^h INNER JOIN ps_orders O在o.id_order = h.id_order .. 。 –