2013-11-29 4 views
1

В этой таблице у меня есть четыре колонкиMySQL получить последние записи по времени и дате без подзапроса

id state_id state  add_time 
1  10   1  1385461144 
2  12   3  1385461144 
3  14   2  1385461144 
4  12   5  1385461264 
5  10   2  1385461264 

я хочу, чтобы получить последние записи по последнему полю (add_time)

результат должен быть таким

id state_id state  add_time 
3  14   2  1385461144 
4  12   5  1385461264 
5  10   2  1385461264 

Я нашел этот вопрос get the records for the latest timestamp mysql и он использует два запроса выбора (подзапрос). но я не хочу использовать подзапрос.

есть ли другой способ получить последние записи?

+1

Что с подзапросов? –

+0

Я думаю, что это медленнее, чем по-другому. – M2sh

+0

'INNER JOIN' или использовать функцию типа MAX (add_time)' :) – M2sh

ответ

5

Существует 2 подхода к получению результатов, которые вы ищете.

левый присоединиться решение:

SELECT t1.* FROM t t1 
LEFT JOIN t t2 
ON t1.state_id = t2.state_id AND t1.add_time < t2.add_time 
WHERE t2.add_time IS NULL 

скрипку here.

решение подзапросов:

SELECT t1.* FROM t t1 
JOIN (
    SELECT state_id, max(add_time) add_time FROM t 
    GROUP BY state_id 
) t2 
ON t1.state_id = t2.state_id AND t1.add_time = t2.add_time 

Fiddle here.

И выведет:

| ID | STATE_ID | STATE | ADD_TIME | 
|----|----------|-------|------------| 
| 3 |  14 |  2 | 1385461144 | 
| 4 |  12 |  5 | 1385461264 | 
| 5 |  10 |  2 | 1385461264 | 
+0

спасибо, какой из них быстрее? – M2sh

+0

Скорее всего второй. Но я бы рекомендовал вам попробовать и попробовать :) –

+0

ОК, я бы протестировал его, но я думаю, что сначала лучше. – M2sh

0

Если вы синхронизируете данные с клиентом (браузер или приложение), для каждого вызова установлен параметр для указания последнего синхронизирующий время (Somthing как lastSyncTime) и на основе по этому запросу ваша база данных. Для первого вызова установите параметр lastSyncTime = 0 в вашей логике, а для последующих вызовов используйте MAX (ADD_TIME). Эти вычисления должны быть на вашей стороне клиента. А на сервере вам нужно, чтобы получить lastSyncTime параметр и сделать что-то запрос, как этот

SELECT id, state_id, state, add_time FROM tabname WHERE add_time > lastSyncTime 

Таким образом, ваш сервер и сервер БД не имеют большую нагрузку.

+0

спасибо, но я не синхронизирую данные, я храню новые состояния каждые 5 минут и хочу получать последние состояния с помощью add_time в моей таблице. – M2sh

+0

@ M2sh ОК, тогда перейдите к JOIN – Damodaran

1

в то время как вы на него, чтобы проверить, какой из них быстрее, вот еще один попробовать http://sqlfiddle.com/#!2/760c73/13/0

SELECT id,state_id,state,add_time 
    FROM t t1 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM t t2 
     WHERE t2.state_id = t1.state_id 
     AND t2.add_time > t1.add_time); 
+0

Спасибо, я испытаю это как можно скорее. – M2sh

Смежные вопросы