2013-04-02 33 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 .. 。 –