2016-08-01 3 views
0

У меня проблема с запросом sql. Мне нужно взять за последние 30 дней, а затем удалить только 4 результатов с «голосования» значение большеSQL-запрос для извлечения максимального значения в заданном временном диапазоне?

дб структуры

Id | time | voting 
1 | unix time | 3 
2 | unix time | 2 
3 | unix time | 4 
4 | unix time | 1 
5 | unix time | 6 

Я хотел бы взять меня только данные: 5-3- 1-2

Я попытался с

select a.* 
from table a 
inner join 
    (select votingng, max(time) as latest from table group by voting) v 
     on a.time = v.latest 
     and a.voting = v.voting 
order by time desc limit 
+0

показать свой 'Артиколи' структуры таблицы – jonju

+0

извините, что я ошибся, стол тот, который я привел в сообщении – Xanger

ответ

1

Похоже, вы пытаетесь получить первые 4 результата голосования за последние 30 дней. Все это дает вам то, что вы хотите?

SELECT a.* 
    FROM table a 
WHERE a.time > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 30 DAY)) 
ORDER BY a.voting DESC 
LIMIT 4; 

или

SELECT a.* 
    FROM table a 
WHERE DATEDIFF(NOW(), FROM_UNIXTIME(a.time)) <= 30 
ORDER BY a.voting DESC 
LIMIT 4; 
+0

У меня есть даты как 1470058711, так и запрос, который вы мне дали, ничего не печатает мне ... – Xanger

+0

Возможно, вам придется убедиться, что вы сравниваете эквивалентные типы данных. Попробуйте выполнить a.time и результаты DATE_SUB с тем же типом данных. Возможно, вам придется провести небольшое исследование типов и сравнений даты и времени MySql. См. Http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html и http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions. .html ,,, Например, вы можете использовать 'DATEDIFF (CURR_DATE(), a.time) <30', но обнаружите, что вам нужно преобразовать a.time в дату, чтобы заставить его работать. – StoneGiant

+0

Сделал некоторые изменения в моем ответе @Xanger. Надеюсь, это поможет. – StoneGiant

1

Я думаю, что это то, что вы хотите:

select v.* 
from voting v 
where timestamp >= unix_timestamp(date_sub(curdate(), interval 1 month) 
order by voting desc 
limit 4; 
+0

У меня есть даты как '1470058711', и запрос, который вы мне дали, ничего не печатает ... – Xanger

0

Надежда это то, что вы ищете:

Select * 
From 
    Voting 
Where 
    time Between CURDATE() And DATE_SUB(CURDATE(),INTERVAL 30 DAY) 
Order By voting Desc 
Limit 4 
0

Попробуйте это, если вы используете Teradata SELECT * из таблицы право row_number() над (порядок по времени desc) = 1;

или

выберите * из (выберите таблицу. *, Row_number() по (порядка по времени DESC), как RANK из таблицы) где RANK = 1

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