Php日历周随机用户计算

时间:2015-09-24 10:32:01

标签: php sql database random bit

我有一个数据库(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周等等......

我的第一个想法是以某种方式更改随机选择器。

任何人都知道如何做到这一点?

1 个答案:

答案 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结果,您只需清除作业表并重新开始。