Как получить строки с максимальной датой при группировании в MySQL?

у меня есть таблица с ценами и сроками на товар:

id
product
price
date

создать новую запись при изменении цены. И у меня есть такой стол:

id product price date
1  1       10    2014-01-01
2  1       20    2014-02-17
3  1        5    2014-03-28
4  2       25    2014-01-05
5  2       12    2014-02-08
6  2       30    2014-03-12

Я хочу получить последнюю цену для всех продуктов. Но когда я группируюсь с "продуктом", я не могу получить цену из строки с максимальной датой.

Я могу использовать MAX(), MIN() или COUNT() функция в запросе, но мне нужен результат, основанный на другом значении.

Я хочу что-то подобное в финал:

product price date
1        5    2014-03-28
2       30    2014-03-12

но я не знаю как. Может быть так:

SELECT product, {price with max date}, {max date}
FROM table
GROUP BY product

4 ответов


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

SELECT  a.*
FROM    tableName a
        INNER JOIN 
        (
            SELECT  product, MAX(date) mxdate
            FROM    tableName
            GROUP   BY product
        ) b ON a.product = b.product
                AND a.date = b.mxdate

Я думаю, самый простой способ-это substring_index()/group_concat() трюк:

SELECT product,
       substring_index(group_concat(price order by date desc), ',', 1) as PriceOnMaxDate
       max(date)
FROM table
GROUP BY product;

еще один способ, который может быть более эффективным, чем group by - это:

select p.*
from table t
where not exists (select 1
                  from table t2
                  where t2.product = t.product and
                        t2.date > t.date
                 );

это говорит: "Получите мне все строки из таблицы, где один и тот же продукт не имеет большей даты."Это причудливый способ сказать "Дайте мне строку с максимальной датой для каждого продукта."

обратите внимание, что есть тонкая разница: вторая форма вернет все строки, которые на максимальную дату, если есть дубликаты.

кроме того, для производительности индекс на table(product, date) рекомендуется.


вы можете использовать подзапрос, который группирует по продукту и возвращает максимальную дату для каждого продукта, и присоединить этот подзапрос обратно к таблице products:

SELECT
  p.product,
  p.price,
  p.date
FROM
  products p INNER JOIN (
    SELECT
      product,
      MAX(date) AS max_date
    FROM
      products
    GROUP BY
      product) m
  ON p.product = m.product AND p.date = m.max_date

SELECT
    product,
    price,
    date
FROM
    (SELECT
        product,
        price,
        date
    FROM table_name ORDER BY date DESC) AS t1
GROUP BY product;