2016-01-30 3 views
-3

Я нашел несколько ответов на этот вопрос в другом месте, однако не смог применить эти ответы в своей конкретной ситуации.Получить одну строку за уникальное значение поля SQL

Давайте следующую таблицу:

ID | Name | Item | Year 
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 
1 | Dan  | Chlorine | 2014 
2 | Dan  | Oxygen  | 2013 
3 | Jon  | Helium  | 2014 
4 | Jon  | Aluminum | 2015 
5 | Dan  | Propane | 2014 
6 | Dan  | Chlorine | 2016 

То, что я ищу это запрос, который возвращает все записи Дэна, но я только хочу, чтобы вернуть последнюю запись (в год), если есть дубликат вещь (нет возможности для галстука).

Так что для приведенной выше таблицы, я хочу следующее вернулся:

ID | Name | Item | Year 
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ 
2 | Dan  | Oxygen  | 2013 
5 | Dan  | Propane | 2014 
6 | Dan  | Chlorine | 2016 

В настоящее время у меня есть следующий запрос, который будет просто получить все пункты Дэна отсортированных по годам:

SELECT * FROM `table` WHERE `Name` = `Dan` ORDER BY `Year` DESC; 

Как Я делаю этот шаг дальше, чтобы получить только один ряд в год за элемент?

+2

Есть тысячи ответов здесь (и в других местах), которые относятся к вашей конкретной ситуации. – Strawberry

+0

выберите * from t1 где (имя, элемент, год) в (выберите имя, элемент, макс (год) от t1, где name = 'Dan' по имени, позиции). Если у вас есть дубликаты для элемента, а год и имя - разные. Я игнорирую оптимизацию. –

+0

@Strawberry Если последнее всегда будет соответствовать более большому идентификатору, тогда запрос может быть упрощен и, скорее всего, будет более эффективным, если предположить, что «id» - это ключ. Я был бы консервативным, хотя [если ОП не поясняется], потому что иногда исправления данных производятся в базах данных, и тогда такие корреляции больше не сохраняются. –

ответ

0
DROP TABLE IF EXISTS tmp_table; 

CREATE TABLE tmp_table as 
SELECT * FROM `table` WHERE 1=0; 

ALTER TABLE tmp_table 
    ADD UNIQUE INDEX UK_tmp_table (Name, Item); 

INSERT IGNORE INTO tmp_table(ID, Name, Item, Year) 
SELECT ID, Name, Item, YEAR FROM `table` WHERE Name = 'Dan' ORDER BY `Year` DESC; 

SELECT * FROM tmp_table ORDER BY ID; 
+0

Как это исключает запись 1 из исходной таблицы, так как есть более поздняя запись, которая должна иметь приоритет (более новый год). – KroniK907

+0

заменить «ORDER BY' Year DESC »на« ORDER BY ID DESC »... в общем –

0

Я закончил с следующим:

SELECT * FROM (SELECT * 
       FROM `table` 
       WHERE `Name` = 'Dan' 
       ORDER BY `year` DESC 
       ) as t1 
      GROUP BY `Name` DESC;