За последние 24 часа нас посетили 36980 программистов и 7800 роботов. Сейчас ищут 1870 программистов ...

Вернуть все записи свыше определенного количества

Тема в разделе "MySQL", создана пользователем 3d_killer, 1 мар 2025.

  1. 3d_killer

    3d_killer Активный пользователь

    С нами с:
    4 апр 2011
    Сообщения:
    14
    Симпатии:
    0
    Всем привет, вроде вопрос простой, но не могу сообразить как правильнее сделать, таблица с графиком для пользователя, там сохраняются значения каждые 3,5 секунд в зависимости от настроек, разрешаем сохранение 10 часов итого если 3 секунды получается 12000 записей, есть поле с датой, то есть нужно выбрать записи и удалить которые превышают это количество естественно старые.
    вот запрос выборки, но это одно значение, а нужно все
    SELECT * FROM temp WHERE user_id="" ORDER BY DATE DESC LIMIT 5000,1
    не могу сообразить как это можно сделать
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Ты не написал каков результат твоего запроса. "не могу сообразить" это конечно ценная информация. только лучше бы ты написал сообщение об ошибке если оно есть. Или если нет, то в чем проблема вообще.

    Код (SQL):
    1. WHERE user_id=""
    А это зачем? Если у тебя нет пользователя с пустым именем, то это лишнее условие. И вообще, строки в SQL надо писать в одинарных кавычках. Двойные имеют особый смысл, лучше не употребляй их.

    DATE в твоём случае это имя колонки? вообще это зарезервированное слово MySQL, поэтому лучше такие имена не давать, а если очень хочется, то писать его в косых кавычках как `date`
    --- Добавлено ---
    Записи превышают количество? нихт понимайт.
    Может быть ты хочешь удалить записи, созданные раньше, чем у запись, которая 5000-ая по порядку при сортировке по полю даты. Так?

    Созданы раньше ... это то же самое, что их поле id меньше чем... Если у тебя есть автоинкрементное поле id.
    Итого, получи саначала этот id как SELECT ID тратата хуйнане. Потом DELETE FROM temp WHERE id < найденное значение.
    Сообоажаешь теперь?
     
  3. 3d_killer

    3d_killer Активный пользователь

    С нами с:
    4 апр 2011
    Сообщения:
    14
    Симпатии:
    0
    Форум не работал, поэтому ранее не отвечал, поля автоинкрементного нет, user_id я просто тут не указал например 10 (без разницы), мне нужно выбрать и удалить все записи принадлежащие данному пользователю с сортировкой по дате, и удалить старые которые превышают 5000 позиций, то есть пропустить первые 5000 в выборке
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    Ну, в принципе DELETE понимает ORDER, так что дерзай. Но, как написали выше, нужно удалять по более существенному признаку, чем кол-во записей. Можно по самому времени, т.к. ты знаешь примерное время появления записей и можешь сравнить с текущим временем за вычетом нужного интервала.

    Только что за имя DATE? Какого типа поле? Там что только даты хранятся? :)
    --- Добавлено ---
    Да, меня эта хрень стала сильно вымораживать. Еще немного и я забью на форум. Вообще позор: на php-форуме вылетают ошибки, да еще с технической детализацией :(
     
    artoodetoo нравится это.
  5. 3d_killer

    3d_killer Активный пользователь

    С нами с:
    4 апр 2011
    Сообщения:
    14
    Симпатии:
    0
    Это график, записи вносятся с текущим временем каждые 2 секунды поле DATE там TIMESTUMP, пишется время, но время не серверное, а текущее время пользователя с другой железки у которой свои часы, можно удалять конечно записи запросом типо "DELETE FROM temp WHERE user_id=:user_id AND date < :date - interval 4 HOUR", но каждые 2 секунды от каждого пользователя довольно ресурсоемко, таблица большая.
    Была идея делать с LIMIT и OFFSET, типо считать количество, если более сотни, то запросом выше и удалять, проблема в том что у DELETE нет возможности использовать OFFSET
     
  6. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Два запроса разделенных ;. Результат первого в переменную. В втором удалять используя эту переменную
     
  7. 3d_killer

    3d_killer Активный пользователь

    С нами с:
    4 апр 2011
    Сообщения:
    14
    Симпатии:
    0
    не забывайте что id нет у меня (автоинкремента)
     
  8. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Метки времени вполне достаточно
     
  9. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    только индекс туда вешать придётся, если чистка постоянно делается
     
  10. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Составной
     
  11. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    97
    Адрес:
    Бавария, Германия
    Добрый день!
    Как постуают на сервер данные пользователей с "других железок" каждые 2 секунды?
    Тут нет узкого горлышка?
    Как часто происходит выборка данных (не удаление мусора, а например, "рисование графиков" )?
    Можно ли в Вашем случае организовать первичную обработку и накапление данных на стороне
    клиентoв и снизить нагрузку на сервер?
    Удачи!