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
Форумы портала PHP.SU :: Версия для печати :: Посчитать и начислять балл пользователю в очереди
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Посчитать и начислять балл пользователю в очереди

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

1. ЮричЪ - 05 Мая, 2015 - 01:09:49 - перейти к сообщению
Добрый вечер!
Есть 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 пользователей...

Подскажите как такое сделать?
2. Panoptik - 05 Мая, 2015 - 12:04:17 - перейти к сообщению
самое тупое решение в лоб
доставать по очереди каждую запись со статусом 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.  

 

Powered by ExBB FM 1.0 RC1