Php日历周随机用户计算

Php日历周随机用户计算,php,sql,database,random,bit,Php,Sql,Database,Random,Bit,我得到了一个数据库(phpmyadmin),我把用户放在其中, 网格看起来像这样 +-----+---------+-----------------+----------------+ | id | user | categorie_bit | calender_week | +-----+---------+-----------------+----------------+ | 1 | Kevin | 01 | 39

我得到了一个数据库(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');
我有各种各样的用户,每个用户都必须在这个日历周为这个实例做一项工作。 用户是从数据库中随机选取的。(我使用了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