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

标签 mysql sql

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

相关文章:

mysql查询where和order by需要很长时间

mysql - 对我的 sql 的完美查询花费了 5 秒以上

c++ - 将 VS 32 位项目转换为 64 位项目

mysql - 在同一个表中使用 JOIN 和 COUNT

php - 从多个表中选择列的总和并按 id 分组

iphone - iPhone 中的数据库连接

mysql - 将 MySQL 表从 Latin1 转换为 UTF8 时整理丢失的信息

sql - MySql - 使用连接的子查询插入多行?

MySQL REGEXP 未能限制出现次数(?!)

sql - MySQL分组限制查询