基于两个相关数据库表打印两个列表

Print two lists based on two related database tables

提问人:MauiRiis 提问时间:2/23/2022 最后编辑:mickmackusaMauiRiis 更新时间:3/1/2022 访问量:84

问:

我有这 2 个 while 循环。

  1. 圈。左侧屏幕。显示附加到任务的用户。

    $getcurrentusers = $conn->prepare("SELECT u.userid, u.username, u.Fname, u.inactive, r.userid, r.job_id FROM users AS u INNER JOIN job_responsible AS r ON u.userid = r.userid WHERE u.inactive = 0 AND r.job_id = $getPostID ORDER BY u.Fname");
    $getcurrentusers->execute();
    $resultgetcurrentusers = $getcurrentusers->get_result();
    $getcurrentusers->close();
    if ($resultgetcurrentusers->num_rows > 0) {
        while($row = $resultgetcurrentusers->fetch_assoc()) {
            echo $row["username"]." (".$row["Fname"].")<br />";
        }
    } else {
        echo "Der er ikke valgt nogle ansvarlige til denne opgave.";
    }
    
  2. 圈。右侧屏幕。列出可添加到任务的所有可能用户

    $getdepartmentview = $SetDepartmentView;
    $explodegetdepartmentview = explode(",",$getdepartmentview);
    $implodegetdepartmentview = "'".implode("','",$explodegetdepartmentview)."'";
    $getusers = $conn->prepare("SELECT userid, username, Fname, inactive FROM users WHERE departmentid IN ($implodegetdepartmentview) AND inactive = 0 ORDER BY Fname");
    $getusers->execute();
    $resultgetusers = $getusers->get_result();
    $getusers->close();
    if ($resultgetusers->num_rows > 0) {
        while($row = $resultgetusers->fetch_assoc()) { 
            echo "<input type=\"checkbox\" name=\"choose_responsible[]\" value=\"".$row["userid"].",\" />".$row["Fname"]."<br />";
        } 
    }
    

问题是,我真的很想,当左侧 1 有匹配项时,输入复选框在右侧被“选中”。圈。

所以。。

Loop 1 | Loop 2
name3  | name1
name5  | name2
name7  | name3 - Inputbox checked
name8  | name4
       | name5 - Inputbox checked
       | name6
       | name7 - Inputbox checked
       | name8 - Inputbox checked
       | name9
       | name10
php 循环 连接 mysqli 条件语句

评论

0赞 CD001 2/23/2022
您可以将循环传递到数组中并使用array_intersect
0赞 mickmackusa 2/23/2022
是否有原因导致无法在单个查询中完成分组?您未在准备好的语句中使用占位符。
0赞 mickmackusa 2/24/2022
您可以通过一个查询获取所需的所有信息。只需使用 LEFT JOIN 而不是 INNER JOIN,并添加 ON 的指定条件部分,而不是 WHERE。r.job_id
0赞 MauiRiis 2/25/2022
我尝试了仅使用 1 个查询的 LEFT JOIN。问题是,它多次列出了用户名,导致 1 个用户可能出现在负责表中。

答:

3赞 Valeriu Ciuca 2/23/2022 #1

在第一个循环中,您可以将user_id存储在数组中

$user_ids[] = $row["userid"]

在第二个循环中,检查当前用户 ID 是否存在于之前保存的 $user_ids 数组中

$checked = false;
if (in_array($row["userid"], $user_ids)) {
    $checked = true;
} 

评论

0赞 mickmackusa 2/23/2022
循环调用可能是所有比较技术中表现最差的。in_array()
1赞 Valeriu Ciuca 2/23/2022
更快的方法是在第一个循环中存储 $user_ids[$row[“userid”]] = 1,并在第二个循环中检查 isset($user_ids[$row[“userid”]])。OP正在学习,我不认为过多地考虑性能。
1赞 RBC 2/23/2022
对于具有大量迭代的in_array的性能,您应该参考此 stackoverflow.com/questions/324665/...但@stackoverflow.com/users/4527645/valeriu-ciuca 是对的,提问者没有考虑性能。
0赞 mickmackusa 2/24/2022 #2

此任务在单个查询中调用 LEFT JOIN,以避免多次访问数据库,并避免结果集上的低效 php 进程。

$sql = <<<SQL
SELECT u.userid,
       u.username,
       u.Fname,
       u.inactive,
       r.userid responsibleUserId,
       r.job_id
FROM users AS u
LEFT JOIN job_responsible AS r
    ON u.userid = r.userid
        AND r.job = ?
WHERE u.inactive = 0
ORDER BY u.Fname
SQL;

$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $getPostID);
$result = $stmt->execute();
$users = $result->fetch_all(MYSQLI_ASSOC);

现在,您拥有了所需的所有数据,因此没有理由访问数据库。

若要列出分配给目标作业的用户,请循环访问关联数组,并向用户显示其中 where is not null。job_id

foreach ($users as $user) {
    if ($user['job_id']) {
        printf('%s (%s)<br />', $user['username'], $user['Fname']);
    }
}

要显示所有用户并有条件地选中已“负责”的名称旁边的支票框,请再次迭代数组并依赖来确定复选框。job_id

foreach ($users as $user) {
    printf(
        '<input type="checkbox" name="choose_responsible[]" value="%d"%s/>%s<br />',
        $user['userid'],
        $user['job_id'] ? ' checked' : '',
        $user['Fname']
    );
}