Xpoint
   [напомнить пароль]

Выбор последних обновленных данных из таблицы - help

Метки: [без меток]
2008-05-30 13:55:01 [обр] Филипп[досье]

Cитуация: есть таблица в которую периодически загружаются данные, например, это количество овощей проданных в год определенным продавцом.
Задача: Выбрать все последние добавленные данные из таблицы. База MySQL 5.

Т.е. например, есть таблица:

YearProductMangerSales
2006ОгурцыВася20
2006ОгурцыПетя30
2005ОгурцыВася20
2005ОгурцыПетя30
2005ОгурцыКоля40
2004ОгурцыВася43
2004ОгурцыПетя76
2006ПомидорыВася32
2005ПомидорыВася43
2005ПомидорыКоля43
2004ПомидорыВася20
2004ПомидорыПетя34

нужно получить следующий результат:

YearProductMangerSales
2006ОгурцыВася20
2006ОгурцыПетя30
2005ОгурцыКоля40
2006ПомидорыВася32
2005ПомидорыКоля43
2004ПомидорыПетя34

Как ни думал, запрос составить не получилось.. :(

спустя 46 минут [обр] GRAy(8/259)[досье]
Филипп[досье] А что значит "последние добавленные данные"? Вот, предположим, я дал вам мешок с камнями - скажите пожалуйста, какие камни я положил туда последними? ;) Критерий отбора таких записей в SQL не доступен (не факт, что и внутренние структуры СУБД хранят подобную информацию), записи в таблице есть и всё - определить когда они были вставлены невозможно если вы этого не предусмотрели заранее. Вариантов может быть несколько, в зависимости от того как вы понимаете под словом "последние".
спустя 1 минуту [обр] Филипп[досье]

Да, извиняюсь, тут неточность в объяснении, под "последними" данными подразумеваются те, у которых год максимальный.

(в реальной базе - у кого максимальна дата добавления)

спустя 2 минуты [обр] Филипп[досье]
т.е. еще раз – нужно получить все записи с различными продавцами и овощами на максимальную дату в единственном экземпляре.
спустя 14 минут [обр] GRAy(8/259)[досье]
select year, product, manager, sales 
from table t join (
  select tt.product, tt.manager, max(year) year
  from table tt 
  group by tt.product, tt.manager
) p on p.product = t.product and p.manager = t.manager and p.year = t.year
спустя 51 минуту [обр] Филипп[досье]
Сорри, непонял. Таблица t - это изначальная таблица, а что такое таблица tt ?
спустя 5 минут [обр] GRAy(8/259)[досье]
Она же. Только это другой алиас.
спустя 10 минут [обр] Филипп[досье]

Честно говоря, все равно, не понял. У меня сейчас в базе одна таблица t, и таблицы tt нет вообще, а в запросе вроде бы ничего не указывает на связку между таблицей t и tt..

Я сейчас пытался выполнить следующий запрос:

SELECT t.product, t.manager, max( `year` ), `year` FROM TABLE t GROUP BY t.product, t.manager

Выдает ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE t GROUP BY t.product, t.manager LIMIT 0, 30' at line 1

Может быть, mysql не позволяет такого?

спустя 18 минут [обр] GRAy(8/259)[досье]
Вы где-нибудь запятую у меня видите между max(year) и year?
tt - это не таблица, это локальный алиас этой таблицы в этом подселекте. Таблица всего одна - table (не знаю как она у вас на самом деле называется). Я проверил на своём экземпляре MySql - селект работает так как я его вам написал.
спустя 1 час 6 минут [обр] Филипп[досье]

Насчет алиаса все понял, прошу прощения за тупизм, запятая - мое изобретение, да :)

Но селект все равно выполнить не могу, когда я его беру в том виде как он есть получаю ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table t join (
  select tt.product, tt.manager, max(year) year
  from table tt' at line 2

если пытаюсь выполнить вариант с апострофами

SELECT `year` , product, manager, sales
FROM `table` t
JOIN (SELECT tt.product, tt.manager, max( `year` ) `year`
FROM `table` tt GROUP BY tt.product, tt.manager) p ON p.product = t.product
AND p.manager = t.manager
AND `p.year` = `t.year`

получаю ошибку
#1052 - Column 'year' in field list is ambiguous

MySQL 5.0.45

спустя 9 минут [обр] GRAy(8/259)[досье]

Грр... ;)

SELECT t.`year` , t.product, t.manager, t.sales
FROM `table` t
JOIN (SELECT tt.product, tt.manager, max( `year` ) `year`
FROM `table` tt GROUP BY tt.product, tt.manager) p ON p.product = t.product
AND p.manager = t.manager
AND `p.year` = `t.year`

Сообщения об ошибках существуют для того, чтобы указать на ошибку ;) и обычно, для простых ошибок (как в данном случае), всё-таки дают представление в чём собснно собака порылась.

спустя 1 минуту [обр] GRAy(8/259)[досье]
Возможно надо не t.`year` а `t.year` и соотв. для всех прочих полей должно быть единообразно.
спустя 30 минут [обр] Филипп[досье]

Ура, получилось! :))

SELECT t.`year` , t.product, t.manager, t.sales
FROM `table` t
JOIN (SELECT tt.product, tt.manager, max( `year` ) `year`
FROM `table` tt GROUP BY tt.product, tt.manager) p ON p.product = t.product
AND p.manager = t.manager
AND p.`year` = t.`year`

Правильно t.`year`

GRay, спасибо огромное, пойду формировать запрос на реальную базу.

Powered by POEM™ Engine Copyright © 2002-2005