基本上,我有两个表: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/