【问题标题】:How can I select rows from a table which are not linked to a different table?如何从未链接到其他表的表中选择行?
【发布时间】:2018-12-17 12:56:43
【问题描述】:

我有 2 张桌子:

用户

------------------------------------
| id (PK) | password | name | role |
------------------------------------

-------------------------------------------
| dogid (PK) | userid (FK : id) | dogname |
-------------------------------------------

我制作了一个表单,您可以在其中将用户链接到狗,但每个用户只能拥有 1 条狗。我制作了一个组合框,您可以在其中选择一个用户,将其链接到一只狗。这行得通

<?php
    $sql = "SELECT * FROM users INNER JOIN dogs ON users.username = dogs.userid WHERE users.role = 'dogowner' ORDER BY name";
    $stmt = $con->prepare($sql);
    $stmt->execute();
    $result = $stmt->fetchAll();
?>
<select id="gebrid" name="gebrid">
    <?php foreach($result as $pers): ?>
    <option value="<?= $pers['username']; ?>"><?= $pers['name']; ?></option>
    <?php endforeach; ?>
</select>

上面的代码选择了所有角色为“dogowner”的用户。我想要第二个 WHERE 条件,它只选择没有狗的用户。

这可能吗,还是我必须更改我的数据库?

【问题讨论】:

  • 基本上,您创建的是每只狗只能有一个主人(与您的描述相反)。为了符合您的描述,我认为外键应该在users 上并允许NULL(= 选择没有狗的用户的条件)
  • INNER JOIN dogs ON users.username = dogs.userid 显示的表结构不起作用,因为表 users 中没有 username。我认为users.id = dogs.userid 是正确的

标签: php mysql sql pdo combobox


【解决方案1】:

使用left join 并添加dogs.userid IS NULL

SELECT users.* 
FROM users 
LEFT JOIN dogs ON users.id = dogs.userid 
WHERE users.role = 'dogowner'
  AND dogs.userid IS NULL
ORDER BY users.name

【讨论】:

  • 你永远不会有 dogs.userid IS NULL 和这个 DB 和那个 JOIN 虽然 ...
  • 我不这么认为。
【解决方案2】:

这样的?

SELECT * 
FROM users 
WHERE id NOT IN (SELECT userid 
                 FROM dogs)

这应该会为您提供所有在 dogs 表的 userid 列中没有 ID 的用户。

【讨论】:

    【解决方案3】:

    对于您的描述(= 1 个用户只能有 1 条狗),DB 应该是:

    用户

    ------------------------------------------------
    | id (PK) | password | name | role | dogid (FK)|
    ------------------------------------------------
    

    ------------------------
    | dogid (PK) | dogname |
    ------------------------
    

    然后

    SELECT * FROM USERS WHERE DogID IS NULL
    

    【讨论】:

    • 所以你会为用户可能拥有的每一种动物都有一个列?
    • 如果不止狗,我宁愿有一张叫animals的桌子。反正不是我的意思。我没有得到的是上面写的约束 每个用户只能拥有 1 只狗(可能因为没有写任何东西,所以每只狗可以由 0、1 或多个用户拥有)。一定是我想念的东西,对吧?如果你明白了,很高兴明白这一点。
    • 我制作了一个表单,您可以在其中将用户链接到狗,但每个用户只能拥有 1 条狗 - 没有人说这条规则是强制在数据库中。它在表单中处理。
    • 但狗是否也可以拥有 MAX 1 个主人?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多