我有一个数据库(phpmyadmin),我放了用户, 网格看起来像这样
+-----+---------+-----------------+----------------+
| id | user | categorie_bit | calender_week |
+-----+---------+-----------------+----------------+
| 1 | Kevin | 01 | 39 |
+-----+---------+-----------------+----------------+
id和用户是自我解释的。 Categorie_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);
在下一步中,我给用户一个“工作”。
Categorie_bit = 1。
现在的问题是,我想选择一个没有“工作”最后一个日历周的用户,以便平等对待所有用户。
编辑: 我如何做到这一点以便进一步使用,让我们说用户1必须工作39周,用户2工作44周等等......
我的第一个想法是以某种方式更改随机选择器。
任何人都知道如何做到这一点?
答案 0 :(得分:1)
只需在查询中添加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结果,您只需清除作业表并重新开始。