Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Посчитать и начислять балл пользователю в очереди

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
ЮричЪ
Отправлено: 05 Мая, 2015 - 01:09:49
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Добрый вечер!
Есть 2 таблицы:
table_turn
(ID, id_user, status)
1, 2, 0;
2, 3, 0;
3, 1, 0;
4, 4, 0;
5, 5, 0;
6, 7, 0;
7, 9, 0;
8, 6, 0;
9, 8, 0;
10, 10, 0;
11, 11, 0;

table_users
(ID, FIO, ball)
1, Иванов, 0;
2, Петров, 0;
3, Сидоров, 0;
4, Семенов, 0;
и так далее

table_turn - это очередь. Задача: по крону запускать скрипт который подсчитывал каждого 5 пользователя и начислял по очереди по 1 баллу.
Например: в таблице (table_turn) ID 1, id_user Петров, status 0 - самый первый в списке, скрипт запустился и подсчитал, что под Петровым есть еще 5 пользователей (ID 2, 3, 4, 5, 6),
за это Петрову начислился 1 балл и статус у него поменялся на 1. Чтобы скрипт его больше не считал. Далее скрипт смотрит ID 2, id_user Сидоров, status 0 и высчитывет еще 5-х (ID 3, 4, 5, 6, 7),
если есть 5 пользователей то Сидорову начисляется 1 балл и статус меняется на 1... С каждым запуском скрипт подсчитывает пользователей в порядке очереди с ID 1 со статусом 0...
Если у последнего пользователя не хватает пользователей (например 3 человка) то скрипт просто отключается до следующего запуска по расписанию.

Я не могу понять, как сделать именно так, чтобы скрипт обрабатывал каждую строку и проверял наличие под ней 5 пользователей...

Подскажите как такое сделать?
 
 Top
Panoptik
Отправлено: 05 Мая, 2015 - 12:04:17
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




самое тупое решение в лоб
доставать по очереди каждую запись со статусом 0
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM table_turn WHERE STATUS = 0 ORDER BY id ASC LIMIT 1;

для каждого выполнять примерно такой запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(*) FROM table_turn WHERE STATUS = 0 AND id > {id предыдущей записи}


собственно если каунт будет больше или равно 5 то это повод добавить баллы пользователю из первого запроса

можно попробовать одним запросом, но не уверен что получится правильно или вообще может положить базу
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT t1.* , count(t1.id)
  2. FROM table_turn t1
  3. LEFT JOIN talbe_turn t2
  4. ON t2.id > t1.id AND t2.STATUS = 0
  5. WHERE t1.STATUS = 0
  6. GROUP BY t1.id
  7. ORDER BY t1.id ASC
  8.  


-----
Just do it
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB