sql — Php Calender Week Расчет случайных пользователей

Я получил базу данных (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 и так далее …

Моя первая идея — как-то поменять случайный сборщик.

Кто-нибудь знает, как этого добиться?

2

Решение

Просто добавьте 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 результатов, вы просто очищаете таблицу заданий и начинаете заново.

1

Другие решения

Других решений пока нет …