gpt4 book ai didi

mysql - 在 MYSQL 中,如何获得一个 LEFT JOIN 以返回一个表中的每一行,以及一个标志(如果在另一个表中有任何匹配的行)?

转载 作者:行者123 更新时间:2023-11-29 02:06:10 26 4
gpt4 key购买 nike

基本上,我有两个表,admin_privilege 和 admin_roll_privilege。我正在尝试编写一个查询以从 admin_privilege 中获取每一行,如果 admin_roll_privilege 中有一行具有匹配的 admin_privilege_id 和匹配的 admin_roll_id,则将新列设置为 1。到目前为止,我有这个:

  SELECT ap.*, 
IF(arp.admin_privilege_id IS NULL,0,1) AS has_privilege
FROM admin_privilege ap LEFT JOIN admin_roll_privilege arp
ON ap.admin_privilege_id=arp.admin_privilege_id
WHERE arp.admin_roll_id=3
OR arp.admin_roll_id IS NULL;

除了没有匹配行 admin_roll_privilege 的情况外,这在所有情况下都有效。

参见示例:

+---------------+--------------------+
| admin_roll_id | admin_privilege_id |
+---------------+--------------------+
| 1 | 2 |
| 1 | 3 |
+---------------+--------------------+

+--------------------+------------------------+
| admin_privilege_id | admin_privilege_name |
+--------------------+------------------------+
| 1 | Access Developer Tools |
| 4 | Edit System Settings |
| 2 | Edit User Profiles |
| 3 | Resolve Challenges |
+--------------------+------------------------+

查询 WHERE admin roll id=1 按预期工作:

+--------------------+------------------------+---------------+
| admin_privilege_id | admin_privilege_name | has_privilege |
+--------------------+------------------------+---------------+
| 1 | Access Developer Tools | 0 |
| 4 | Edit System Settings | 0 |
| 2 | Edit User Profiles | 1 |
| 3 | Resolve Challenges | 1 |
+--------------------+------------------------+---------------+

但是,如果我查询 admin_roll_id=3,我只会返回两行:

+--------------------+------------------------+---------------+
| admin_privilege_id | admin_privilege_name | has_privilege |
+--------------------+------------------------+---------------+
| 1 | Access Developer Tools | 0 |
| 4 | Edit System Settings | 0 |
+--------------------+------------------------+---------------+

如何让这个查询返回所有 4 个?

编辑:这是最终起作用的,将条件移动到 on 子句:

SELECT ap.*, 
IF(arp.admin_privilege_id IS NULL,0,1) AS has_privilege
FROM admin_privilege ap LEFT JOIN admin_roll_privilege arp
ON (ap.admin_privilege_id=arp.admin_privilege_id AND arp.admin_roll_id=1)

最佳答案

将适当的条件从 WHERE 子句移至 ON 子句。

关于mysql - 在 MYSQL 中,如何获得一个 LEFT JOIN 以返回一个表中的每一行,以及一个标志(如果在另一个表中有任何匹配的行)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5617988/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com