Я столкнулся с довольно странной проблемой. У меня есть следующие примеры данных для работы с в базе данных MySQL:SQL: необходимо ограничить набор результатов на основе подзапроса
|key| data| index | total | timestamp | | # | a | 1 | 2 | 2009-01-02 01:01:32 | | $ | b | 2 | 2 | 2009-01-02 01:03:32 | | % | c | 1 | 3 | 2009-01-03 01:01:32 | |^| d | 2 | 3 | 2009-01-03 01:04:32 | | & | e | 3 | 3 | 2009-01-03 01:02:32 | | * | f | 1 | 2 | 2009-01-05 01:01:32 |
Что происходит в том, что другой процесс (не под моим контролем) принимает пакеты данных и их хранение непосредственно в базу данных с отметкой времени для время прибытия. Предполагается, что пакеты поступают в пакет ... a, b будут приближаться друг к другу и индексируются 1 и 2, причем каждый пакет содержит «общее» количество переданных пакетов. ключ - это обычный первичный ключ с автоматическим добавлением.
Что мне нужно - это представление, в котором будет отображаться самый последний список, который прибыл (неполный список, если не все поступившие пакеты, является приемлемым).
Для этого запроса в идеале должен быть только «f», но я не вижу способа сделать это. Если мы не сможем получить его другим способом, то возвращение «a» и «f» будет приемлемым. Другими словами, небольшое количество дополнительных данных, которые вылавливаются оператором select, не является огромной проблемой. В течение периода времени до прибытия «f» правильный возврат - c, d и e.
Мои общие мысли были вдоль линий:
SELECT * FROM table WHERE total = ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table ) ) ORDER BY DESC timestamp LIMIT ( SELECT total FROM table WHERE timestamp = ( SELECT MAX(timetamp) FROM table )
Как некоторые из вас, наверное, заметили, вы не можете сделать подзапрос в предложении LIMIT (по крайней мере, с MySQL). У кого-нибудь есть другой подход к решению этой проблемы? Вышеупомянутый запрос можно сделать намного более чистым, вложив JOIN в небольшой список последних идентификаторов, но все еще оставляет проблему подзапроса LIMIT в подзапросе.
В качестве двухэтапного запроса это относительно тривиально. Проблема в том, что он должен стать определяющим оператором select для VIEW.
Редактировать, чтобы исправить неправильный SQL пример
Можете ли вы попытаться четко объяснить, что составляет «последнее»? Поскольку вы говорите, что «F» и «A» будут приемлемы, это не похоже на прямую метку времени. –
Я предполагал подход, в котором вы гарантировали бы уникальные значения «индекса», гарантируя, что вы не вернете больше, чем «полные» строки. В основном говоря, что, хотя для «f» очень важно вернуться, возвращение «а» также не будет фатальным недостатком. – user73917
Жаль, что для каждой коллекции нет идентификатора, если у вас есть диапазон коллекции в течение 2 дней или две коллекции перекрываются, у вас будут проблемы. – Adam