2013-09-17 11 views
0

Я не очень хорошо знаком с MySQL, поэтому мне нужна ваша помощь.Smart select from MySQL

У меня есть таблица со столбцами

LOGID, playerId, Playername, updateTime

LOGID первична и автоинкрементным. playerId является INT (11) Playername является VARCHAR (36) updateTime является ИНТ, а также (хранение Отметка времени Unix, когда запись сделана)

У меня есть эти записи в базе данных:

1, 444, Джон, 1379434514

2, 444, Джон, 1379434414

3, 445, Mike, 1379434410

4, 444, Джон, 1379434614

Я хотел бы извлечь только один для каждого уникального playerId, с наибольшим целым числом в колонке "updateTime" (в этом Например, он имеет logId 4 для playerId из 444).

Есть ли способ объединить все записи для определенного игрока, а затем выбрать один из них (самый новый)? Спасибо!

ответ

3

Вы хотите groupwise maximum, который может быть получен путем присоединения таблицы с подзапросом, который выбирает идентифицирующий (максимальный) updateTime для каждой группы:

SELECT * FROM my_table NATURAL JOIN (
    SELECT playerId, MAX(updateTime) updateTime FROM my_table GROUP BY playerId 
) t 

Посмотрите на sqlfiddle.

Обратите внимание, что вы действительно должны использовать тип TIMESTAMP MySQL для updateTime; и, кроме того, я подозреваю, что playerName может нарушить 2NF.

+0

Вот, спасибо так много! Зачем использовать MySQL TIMESTAMP для updateTime? Что случилось с использованием time() в PHP? –

+0

И что с этим «t» в конце запроса? –

+0

@ ToniPerić: 't' является псевдонимом, заданным для таблицы, которая материализована из подзапроса; это может быть все, что вы хотите. – eggyal

0

Если я правильно понимаю, вы можете просто написать:

select max(updateTime) 
from t1 
group by playerId 

См SQLFiddle

+0

Я думаю, что OP также хочет другие соответствующие поля, такие как 'logId'? – eggyal

+0

Но это возвращает только столбец updateTime, мне нужны все они (*), где updateTime является наибольшим числом для группы из одного игрока. –

+0

Спасибо за разъяснение - +1 для @eggyal –