如何运行此MySQL连接查询?

如何运行此MySQL连接查询?,mysql,sql,database,Mysql,Sql,Database,假设我有两张桌子 第一个表是人物角色列表。一个用户可以有许多角色 mysql> select id, user_id, name from personas_personas; +----+---------+--------------+ | id | user_id | name | +----+---------+--------------+ | 8 | 1 | startup | | 9 | 1 | nerd

假设我有两张桌子

第一个表是人物角色列表。一个用户可以有许多角色

mysql> select id, user_id, name from personas_personas;
+----+---------+--------------+
| id | user_id | name         |
+----+---------+--------------+
|  8 |       1 | startup      |
|  9 |       1 | nerd         |
| 10 |       1 | close        |
| 12 |       2 | Nerd         |
| 13 |       2 | Startup      |
| 14 |       2 | Photographer |
+----+---------+--------------+
6 rows in set (0.00 sec)
现在,我有另一个表叫做approvals

mysql> select id, from_user_id, to_user_id, persona_id  from friends_approvals;
+----+--------------+------------+------------+
| id | from_user_id | to_user_id | persona_id |
+----+--------------+------------+------------+
|  2 |            1 |          2 |          8 |
|  3 |            1 |          2 |          9 |
+----+--------------+------------+------------+
2 rows in set (0.00 sec)
如果from_用户希望批准to_用户加入角色,则会插入一条记录

我正在尝试做这个查询

给定一个用户,查找其所有角色。然后,对于每个角色,确定它是否被某个to_用户批准。如果是,则返回结果集中的值为1。否则,结果集中的return is_approved=0

这就是我的出发点:

SELECT *
FROM personas_personas
WHERE user_id = 1
LEFT JOIN friends_approvals ON
...but i don't know where to go from here.
因此,最终的结果集应该包含personas\u personas表中的所有列,然后每个结果都应该得到批准

 SELECT 
   pp.*,
   CASE
     WHEN exists (
         SELECT 
          * 
         FROM 
          friends_approvals fa  
         WHERE 
          fa.from_user_id = pp.user_id AND
          fa.persona_id = pp.id AND
          fa.to_user_id = 2
          )
      THEN 1
      ELSE 0
   END as is_approved

 FROM 
   personas_personas pp 
 WHERE 
   pp.user_id=1
或者,根据您的口味:

 SELECT 
   pp.*,
   CASE
     WHEN fa.from_user_id IS NOT NULL
      THEN 1
      ELSE 0
   END as is_approved

 FROM 
   personas_personas pp 
     LEFT OUTER JOIN friends_approvals fa ON
       pp.user_id = fa.from_user_id AND
       pp.id = fa.persona_id AND
       fa.to_user_id = 2
 WHERE 
   pp.user_id=1
或者,根据您的口味:

 SELECT 
   pp.*,
   CASE
     WHEN fa.from_user_id IS NOT NULL
      THEN 1
      ELSE 0
   END as is_approved

 FROM 
   personas_personas pp 
     LEFT OUTER JOIN friends_approvals fa ON
       pp.user_id = fa.from_user_id AND
       pp.id = fa.persona_id AND
       fa.to_user_id = 2
 WHERE 
   pp.user_id=1

如果我正确理解您的需求,您可以这样做:

SELECT personas_personas.*,
       CASE WHEN friends_approvals IS NULL THEN 0 ELSE 1 END AS is_approved
  FROM personas_personas
  LEFT
 OUTER
  JOIN friends_approvals
    ON friends_approvals.from_user_id = ...
   AND friends_approvals.to_user_id = personas_personas.user_id
   AND friends_approvals.persona_id = personas_personas.id
 WHERE personas_personas.user_id = ...
;
它将查找具有指定用户id的每个personas\u personas记录,以及该用户中该用户是否已被指定from\u用户id批准的指示符


如果这不是你想要的,那么请澄清

如果我正确理解您的需求,您可以这样做:

SELECT personas_personas.*,
       CASE WHEN friends_approvals IS NULL THEN 0 ELSE 1 END AS is_approved
  FROM personas_personas
  LEFT
 OUTER
  JOIN friends_approvals
    ON friends_approvals.from_user_id = ...
   AND friends_approvals.to_user_id = personas_personas.user_id
   AND friends_approvals.persona_id = personas_personas.id
 WHERE personas_personas.user_id = ...
;
它将查找具有指定用户id的每个personas\u personas记录,以及该用户中该用户是否已被指定from\u用户id批准的指示符


如果这不是你想要的,那么请澄清

仅供参考,为了更好地规范化,您应该有一个User、Persona和UserPersona表。然后可能是一个包含所有批准的UserPersonaUser表。@BradChristie我有一个User表和一个Persona表。为什么我需要UserPersona表?避免重复的角色。一旦persona XYZ成为persona表,就不能复制它,只需重新分配/使用即可。UserPersonal将是一种多对多关系。除非我完全可能误解了该方案,否则您应该有一个User、Persona和一个UserPersona表,以便更好地规范化。然后可能是一个包含所有批准的UserPersonaUser表。@BradChristie我有一个User表和一个Persona表。为什么我需要UserPersona表?避免重复的角色。一旦persona XYZ成为persona表,就不能复制它,只需重新分配/使用即可。UserPersonal将是一种多对多关系。除非我完全可能误解了这个方案,否则一般的方法是可行的,但我觉得你询问的一些细节不合适。特别是,我不认为我们可以忽略朋友的批准。人物身份。嗨,杰克,谢谢!这一开始不起作用。但我补充了这一点:并且fa.persona_id=pp.idyeah,我刚刚更新了我的答案,在阅读了@ruakh的评论后,我认为一般的方法是可行的,但是你的查询的一些细节在我看来并不正确。特别是,我不认为我们可以忽略朋友的批准。人物身份。嗨,杰克,谢谢!这一开始不起作用。但我补充了这一点:在阅读了@ruakh的评论后,我刚刚更新了我的答案,将其包括在内