社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

TheQuestionmark • 2 年前 • 125 次点击  

编辑:在预览中,表格显示正确。一个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子句是不正确的,但我测试的所有其他语句都没有给出我想要的结果。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131723
 
125 次点击  
文章 [ 1 ]  |  最新文章 2 年前
MatBailie
Reply   •   1 楼
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