2015-05-10 165 views
0

我使用SUM來合併字段之一,但對於其餘字段我希望那些來自最新條目。mysql SUM與ORDER BY聚合

當前查詢:

SELECT cu.*, 
SUM(cu.use_count) AS total_use_count 
FROM coupons_used cu 
GROUP BY cu.coupon_id; 

當前的結果:

Array 
(
    [0] => stdClass Object 
     (
      [id] => 1 
      [timestamp] => 2015-05-08 04:52:31 
      [coupon_id] => 133 
      [user_id] => 104 
      [use_count] => 1 
      [redemption_code] => 123412341234 
      [total_use_count] => 2 
     ) 

) 

這個時間戳記是從第一個條目,我想它是從最後一次。我試過加ORDER BY cu.timestampASCDESC但我得到相同的結果。 total_use_count需要保持原樣,但是如何從最後一個條目(每個課程的分組)中獲取剩餘的字段?

回答

4

如果(coupon_id,timestamp)元組是唯一的(也就是說,如果我們保證不會有兩個(或更多)的行與同timestamp值對於給定的coupon_id,至少在「最新」時間戳)....

SELECT c.id 
    , c.timestamp 
    , c.coupon_id 
    , c.user_id 
    , c.use_count 
    , c.redemption_code 
    , m.total_use_count 
    FROM (SELECT MAX(mt.timestamp) AS latest_timestamp 
       , SUM(mt.use_count) AS total_use_count 
       , mt.coupon_id 
      FROM coupons_used mt 
      GROUP BY mt.coupon_id 
     ) m 
    JOIN coupons_uses c 
    ON c.coupon_id = m.coupon_id 
    AND c.timestamp = m.latest_timestamp 

如果(coupon_id,timestamp)不是單闕;如果可能有兩行具有相同的時間戳給定coupon_id,並且如果我們想要爲每個coupon_id只返回一行...

我們可以使用MySQL的擴展GROUP BY並添加到結尾查詢:

GROUP BY c.coupon_id 
2

當您使用GROUP BY您返回應該是兩類列:

  • 與聚合函數計算的A柱,或
  • 一列,它是GROUP BY列表的一部分。

MySQL的放鬆,讓你把任何列在選擇列表此限制,但這個附帶了一組中的任何行可以由引擎隨意選擇,爲您的列提供的價值的認識。

如果你想最後一個時間戳,穿上它MAX功能:

SELECT 
    coupon_id 
, SUM(cu.use_count) AS total_use_count 
, MAX(cu.timestamp) AS timestamp 
FROM coupons_used cu 
GROUP BY cu.coupon_id; 
+0

有什麼辦法可以得到整個最後一行? 'redemption_code(UNIQUE)'是我爲什麼需要最新的條目。 – Jacksonkr

+1

@Jackson由於'redemption_code'不是一個分組項目,您可能想要加入'id'和'timestamp'。到桌上來得到它。它看起來像spencer7593給你一個工作答案,所以我不會在這裏重現它。 – dasblinkenlight

1

要得到的總和你這樣做:

SELECT SUM(use_count) AS total_use_count, coupon_id 
    FROM coupons_used 
    GROUP BY coupon_id 

但是,以獲得最新的條目每個coupon_id你做到這一點。

SELECT c.* 
    FROM coupon_id AS c 
    JOIN ( SELECT MAX(id) AS id 
       FROM coupon_id 
      GROUP BY coupon_id 
     ) m ON c.id = m.id 

內部SELECT獲取一個表,其中包含每個coupon_id的最新條目的行號。然後將它加入主表中,從主表中抽出細節。

最後,您必須將所有這些加在一起,以獲得每個coupon_id的一行,包括總數和最新的。

SELECT c.*, a.total_use_count 
    FROM coupon_id c 
    JOIN ( SELECT MAX(id) AS id 
       FROM coupon_id 
      GROUP BY coupon_id 
     ) m ON c.id = m.id 
    JOIN (
      SELECT SUM(use_count) AS total_use_count, coupon_id 
      FROM coupons_used 
     GROUP BY coupon_id 
     ) a ON a.coupon_id = c.coupon_id 

您試圖使用GROUP BY的方式使用了標準GROUP BY的麻煩的MySQL擴展。這就是爲什麼錯誤的行回來了。你可以閱讀這些以獲取更多信息。 http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html