我得到了一个数据库(phpmyadmin),我把用户,网格看起来像这样
+-----+---------+-----------------+----------------+
| id | user | categorie_bit | calender_week |
+-----+---------+-----------------+----------------+
| 1 | Kevin | 01 | 39 |
+-----+---------+-----------------+----------------+
id和用户是自解释的。Categorie_bit代表他/她目前要做的工作,比如遛狗。
0 -没有工作
1 -任务1
10 -作业2
11 -两个工作
和日历周显示当前日历周。
$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);
在下一步中,我给用户一个"job"。
Categorie_bit = 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个结果,您只需清除作业表并重新开始。