Php日历周随机用户计算
我得到了一个数据库(phpmyadmin),我把用户放在其中, 网格看起来像这样Php日历周随机用户计算,php,sql,database,random,bit,Php,Sql,Database,Random,Bit,我得到了一个数据库(phpmyadmin),我把用户放在其中, 网格看起来像这样 +-----+---------+-----------------+----------------+ | id | user | categorie_bit | calender_week | +-----+---------+-----------------+----------------+ | 1 | Kevin | 01 | 39
+-----+---------+-----------------+----------------+
| 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');
我有各种各样的用户,每个用户都必须在这个日历周为这个实例做一项工作。
用户是从数据库中随机选取的。(我使用了PDO包装器)
在下一步中,我给用户一个“作业”
分类位=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
然后可以使用以下查询:
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个结果,您只需清除作业表并重新开始。您知道该位,您可以将其存储为十进制整数,因此两个作业只需0、1或2(以及3)。然后你可以使用来测试它们。我这样做是为了以后更具动态性,比如如果我想添加一些东西当然,如果你想添加另一个作业,作业3,那么你的二进制数是100,也就是4。您可以只存储作业3的小数点4,然后存储作业4的小数点8。如果他们有多个作业,你只需将数字相加,那么作业1和作业3将是十进制5,二进制101。好的,谢谢,我想保持分类位与现在一样,不要误解。我这样做也是为了学习:)但再次感谢你们!谢谢,我会和PDO一起尝试,你知道如何在将来的案例中扩展这个吗?假设用户1做了第39周日历,用户2做了第44周日历,以此类推。我不能-1,如果我想扩展它以备将来使用。我还将编辑这个问题。如果你想这样扩展它,这样每个人最终都有一份工作,我会以不同的方式组织它。我将在一分钟内更新我的答案。请解释一下您的sql查询。如果作业表中不存在用户的记录,那么作业中的所有字段都将为空,因此我们所做的就是加入作业并检查id是否为空(即没有记录)。如果有记录ID,则不会为空,因此将从搜索结果中排除该记录。
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