在MYSQL中,如何获得一个左连接以返回一个表中的每一行,以及一个标志(如果另一个表中有任何匹配的行)?
基本上,我有两个表,admin_特权和admin_roll_特权。我正试图编写一个查询,从admin_权限中获取每一行,如果admin_roll_权限中有一行具有匹配的admin_权限id和匹配的admin_roll_id,则将新列设置为1。到目前为止,我有:在MYSQL中,如何获得一个左连接以返回一个表中的每一行,以及一个标志(如果另一个表中有任何匹配的行)?,mysql,sql,Mysql,Sql,基本上,我有两个表,admin_特权和admin_roll_特权。我正试图编写一个查询,从admin_权限中获取每一行,如果admin_roll_权限中有一行具有匹配的admin_权限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_r
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\u roll\u权限
见示例:
+---------------+--------------------+
| 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 |
+--------------------+------------------------+
查询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\u roll\u 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子句。在整个语句中使用
WHERE
子句并不是返回所有行。将
LEFT JOIN
转换为一个子选择,您可以在其中添加所需的WHERE
子句
SELECT ap.admin_privilege_id
, ap.admin_privilege_name
, IF(arp.admin_privilege_id IS NULL,0,1) AS has_privilege
FROM admin_privilege ap
LEFT OUTER JOIN (
SELECT admin_privilege_id
FROM admin_roll_privilege arp
WHERE arp.admin_roll_id = 3
) arp ON arp.admin_privilege_id = ap.admin_privilege_id
是的,成功了。我以前做过,应该知道得更清楚。我想我今天做这件事太久了。非常感谢!