Я получил базу данных (phpmyadmin), в которую я помещаю пользователей,
сетка выглядит так
+-----+---------+-----------------+----------------+
| id | user | categorie_bit | calender_week |
+-----+---------+-----------------+----------------+
| 1 | Kevin | 01 | 39 |
+-----+---------+-----------------+----------------+
Идентификатор и пользователь говорят сами за себя. Категория_bit обозначает текущую работу, которую он / она должен выполнять, например, гулять с собакой.
0 — нет работы
1 — работа 1
10 — работа 2
11 — обе работы
и календарная неделя показывает текущую календарную неделю.
как это в php:
$date = new DateTime();
echo $date->format('W');
У меня есть различные пользователи, каждый пользователь должен сделать работу для этой недели календарей для этого экземпляра 39.
Пользователь выбирается случайным образом из базы данных. (Я использовал PDO Wrapper)
$table = "users";
$columns = array("id", "firstname");
$orderBy = array('RAND()');
$result_set = $db->select($table,$columns, Null, Null, $orderBy, 1);
На следующем шаге я даю пользователю «работу».
Категория_бит = 1.
Теперь проблема в том, что я хочу выбрать пользователя, у которого не было «работы» на прошлой неделе календарей, чтобы ко всем пользователям относились одинаково.
Редактировать:
Как мне сделать это для дальнейшего использования, допустим, пользователю 1 пришлось работать на неделе 39, а пользователю 2 — на неделе 44 и так далее …
Моя первая идея — как-то поменять случайный сборщик.
Кто-нибудь знает, как этого добиться?
Просто добавьте WHERE
пункт к вашему запросу, проверяющий, есть ли запись на прошлой неделе для вашего пользователя. Я не знаком с вашей оболочкой PDO, но результирующий запрос должен быть:
SELECT u.id, u.firstname
FROM users u
WHERE (
SELECT COUNT(*)
FROM users u2
WHERE u.id = u2.id
AND u2.calendar_week = <?= $date->format('W') - 1 ?>
AND u2.categorie_bit > 0
) = 0
ORDER BY RAND()
LIMIT 1
ОБНОВИТЬ
Чтобы убедиться, что каждому пользователю не было назначено другое задание, пока каждый пользователь не выполнил задание хотя бы один раз, я записал информацию по-разному. У меня будет две таблицы: одна для пользователей, другая для работы, которую они выполнили, и неделя, когда они ее выполнили.
Users
+----+-------+
| id | user |
+----+-------+
| 1 | Kevin |
+----+-------+
Jobs
+----+--------+-----+------+
| id | userId | job | week |
+----+--------+-----+------+
| 1 | 1 | 01 | 39 |
| 2 | 2 | 10 | 39 |
| 3 | 6 | 01 | 40 |
| 4 | 8 | 10 | 40 |
+----+--------+-----+------+
Тогда вы можете использовать следующий запрос:
SELECT u.id, u.user
FROM users u
LEFT JOIN jobs j ON u.id = j.userId
WHERE j.id IS NULL
ORDER BY RAND()
LIMIT 1
Так что теперь у вас есть только пользователи, которые не завершили работу. Когда все выполнят задание и запрос вернет 0 результатов, вы просто очищаете таблицу заданий и начинаете заново.
Других решений пока нет …