Ребят перед нами база mysql id login pass ochered 100 fazzz ****** 0 101 kuku ****** 44 102 mamuk ****** 37 103 loff ****** 38 ..... История есть куча пользователей у каждого есть ID LOGIN PASS и ОЧЕРЕДЬ. Очередь имеют только люди которые онлайн. Например в базе 1000 пользователей из них 150 в онлайне. Пользователь Infiniti добавляется в онлайн строчка в базе с очередью у него 151 (по условию) а вот если пользователь KUKU уйдет с сайта его ячейка где написано 37 станет нулем. Как реализовать чтобы все с 38 по 151 очередь свою очередь понизили на единицу. Я понятно расписал??? Прошу ребят помогите! всю голову изломал! Необходимо реализовать используя PHP + Mysql (поменьше нагрузки на БД)
Вообще,каждый раз шевелить всю таблицу не самый хороший вариант, но,раз просишь (удаляется юзер с очередью 44 в примере) DELETE <ЮЗЕР С ОЧЕРЕДЬЮ 44> UPDATE <ИМЯ ТАБЛИЦЫ> SET ochered=ochered-1 WHERE ochered>43 ИМХО, правильнее делать выборку юзера с минимальным значением ochered - меньше нагрузка на базу будет
Первый вариант и так "почти код", а для оформления второго желательно знать некоторые тонкости о проекте, в частности, о предполагаемой нагрузке - исходя из этого логика может быть разной. В общем,основная идея понятна, но вот может передумаешь над реализацией такого метода "очереди"? Смотри, если тебе надо добавить новое значение в очередь,тебе придется либо: а.Использовать автоинкремент и задуматься над тем,как избежать переполнения счетчика - это чуть быстрее,но реализация механизма контроля переполнения счетчика потребует усилий, плюс на время,пока база в "обслуживании" придется приостановить с ней работу(добавление новых записей в таблицу - точно). б.Каждый раз вычислять максимальное значение самому - это позволит избываться от механизма контроля за переполнением счетчика,но даст еще дополнительную нагрузку на сервер - тоже не хороше, хотя лучше чем вариант (а). Оба варианта ,плюс ко всему, создадут совсем ненужную нагрузку на сервер. Попробуй так - выдели поле, в которе записывай максимально точно ВРЕМЯ запроса на обслуживание, плюс поле для отметки обслуженных/выбывших клиентов. Потом останется просто выбирать одну запись с минимальным временем,у которой не установлена отметка "обслужен/выбыл" - это будет правильнее ИМХО.
Итак максимальное кол-во зарегистрированных пользователей 100 человек(больше быть не может). Редко в онлайне более 30. Приведенная выше таблица из БД имеет название user есть также другая таблица с наименованием temp куда в некоторую ячейку zzzz я записываю число максимально достигнутой очереди. Т.е если логинится пользователь т.е станет онлайн - значение zzzz +1 если же кто-то офлайнится zzzz -1. каждый пользователь выполняет задание! После выполнения которого переводится на последнее место в очереди. Задания каждым пользователем выполняются примерно 1 раз в 15- 30 минут. т.е за это время очередь успевает сделать круг. т.е очередь меняется примерно 1 раз в минуту. Предлагаемый вами вариант про приостановление работы не подходит! ведь очередь меняется очень быстро.... А про автоинкремент я непонял!!! есть еще мысли???? в итоге имеем 3 случая когда нам необходимо редактировать очередь: 1. выход пользователя в онлайн { это легко } 2. уход в оффлайн { ломаю голову } 3. уход в конец очереди после выполнения задания { вытекает из второго }
При таком количестве пользователей о нагрузке на сервер точно не стоит ломать голову. Не имея точной постановки задачи, а только то,что было написано тут,могу предположить: Таблица temp не нужна - достаточно запроса SELECT max(ochered) FROM user - и на руках максимальное значение (последнего) номера в очереди - это немного упростит логику работы. Для уменьшения у всех пользователей в таблице значения поля ochered проще воспользоваться запросом UPDATE user SET ochered=ochered-1 (это в случае выполнения задания) Для дисконнекта два запроса DELETE FROM user WHERE ochered="номер в очереди выбывшего юзера" UPDATE user SET ochered=ochered-1 WHERE ochered>"номер в очереди выбывшего юзера" Лучше постучи в асю - помогу с этим