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

在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

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

是的,成功了。我以前做过,应该知道得更清楚。我想我今天做这件事太久了。非常感谢!