2015-05-10 4 views
0

Я использую SUM для добавления одного из полей, но для остальных полей мне бы хотелось, чтобы они были получены из последней записи.mysql SUM aggregate with 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.timestamp как ASC, так и DESC, но я получаю тот же результат. 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 столбцы, которые вы возвращаете должны быть одной из двух категорий:

  • колонке вычисляется с агрегатной функцией, или
  • столбец, который является частью 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. Затем, присоединяясь к основному столу, вытащить детали из главного стола.

Наконец, вы должны объединить все это вместе, чтобы получить одну строку для каждого купона_ид, с суммой и последним.

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 использовала беспокойное расширение MySQL к стандартному GROUP BY. Вот почему неправильный ряд вернулся. Вы можете прочитать это для получения дополнительной информации. http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html