代码之家  ›  专栏  ›  技术社区  ›  TheQuestionmark

MySQL连接两个表,给出表1的所有条目[重复]

  •  0
  • TheQuestionmark  · 技术社区  · 2 年前

    编辑:在预览中,表格显示正确。一个mod能帮我纠正一下吗?我不知道我做错了什么。

    我有三张桌子。

    表1:tbl_用户

    身份证件 用户名
    1. 用户A
    2. 用户B

    表2:tbl_位置

    身份证件 地方
    1. 城市1
    2. 城市2
    3. 城市3

    表3:tbl_用户位置

    fk_用户 fl_位置
    1. 1.
    2. 1.
    2. 2.

    现在我有了一个HTML页面来编辑用户数据

    我有两个问题。一个用于读取用户数据,另一个用于位置。

    public function readOneUser($id)
    {
        $stmt = $this->pdo->prepare("SELECT * FROM tbl_user WHERE id = :id");
        $stmt->execute([
            'id' => $id
        ]);
        $stmt->setFetchMode(PDO::FETCH_CLASS, "administration\\CMR\\UserModel");
        $res = $stmt->fetch(PDO::FETCH_CLASS);
        return $res;
    }
    

    没关系。一切都很好。我有普通的用户数据,比如用户名,邮件,电话。。。

    现在我想要一个所有位置的完整列表,但是(这就是问题所在)应该检查分配给用户的所有位置。不应选中未分配用户的位置,而应列出这些位置。

    <?php
        foreach ($readLocations AS $location):
        ?>
        <input type="checkbox" name="location" <?= htmlspecialchars($location->id == $location->fk_location) ? "checked" : "" ?> value="<?= $location->id; ?>"><span><?= $location->location; ?></span><br>
        <?php
        endforeach;
    ?>
    

    我有这个疑问。我知道这是错误的,但这是我所拥有的最好的。希望你能帮我改正。

    public function readAllLocationsForEdit($id)
    {
        $stmt = $this->pdo->prepare("
            SELECT tbl_location.*, tbl_userlocation.*
            FROM tbl_location
            LEFT JOIN tbl_userlocation ON tbl_userlocation.fk_location = tbl_location.id 
            WHERE fk_user = :id
            GROUP BY location");
        $stmt->execute([
            'id' => $id
        ]);
        $res = $stmt->fetchAll(PDO::FETCH_CLASS, "administration\\CMR\\LocationModel");
        return $res;
    }
    

    通过这个,我得到了所有分配用户的位置,但没有分配用户的位置。我知道WHERE子句是不正确的,但我测试的所有其他语句都没有给出我想要的结果。

    1 回复  |  直到 2 年前
        1
  •  3
  •   MatBailie    2 年前

    这个 WHERE 第条适用 之后 这个 JOIN .

    为了满足您的需要,您也需要过滤userlocation映射 之前 在期间 加入。要么在联接谓词中包含用户筛选器,要么在筛选用户的子查询中联接 (前者是通常的、更干净的方法) .

         FROM tbl_location
    LEFT JOIN tbl_userlocation
           ON tbl_userlocation.fk_location = tbl_location.id 
          AND tbl_userlocation.fk_user     = :id
    

         FROM tbl_location
    LEFT JOIN (SELECT * FROM tbl_userlocation WHERE fk_user = :id) AS tbl_userlocation 
           ON tbl_userlocation.fk_location = tbl_location.id