加入三张表并不能产生所需的结果

时间:2017-09-23 20:14:28

标签: mysql

我已经尝试了好几个小时才能得到这个。我仍然是mysql的新手,但是在使用我找到的资源和示例之后,我设法实现了令我印象深刻的查询。我有点卡在这里。如果我不这么好问,请道歉。

三个表,用于管理项目中的类别和类别成员资格。

table a = project membership
id user_id project_id
== ======= ==========
1  1       10
2  1       12
3  3       45
4  5       12



table b = categories 
id name project_id
== ==== ==========
1  cat1 10
2  cat4 12
3  cat8 45




tabke c = category members
id user_id_added category_id capability
== ============= =========== ==========
1  1             2           1
2  3             3           2
3  5             3           1
4  5             2           0



Required result


members of project 2

user_id category capability_in_category
======= ======== ====================== 
1       2        1
5       2        0


SELECT a.user_id
       , c.capability
       , b.id as category

    FROM a
       LEFT OUTER JOIN b
           ON a.project_id = c.project_id
       LEFT OUTER JOIN c
           ON b.id = c.category_id
       WHERE a.project_id = $project_id
       AND c.category_id = $category_id;

感觉我不需要加入这三个表,但我没有看到使用类别成员表加入项目表而不使用类别表(b)的方法。我运行的查询几乎可以工作,但用户功能没有正确返回。我使用左外连接作为成员可能并不总是属于类别的一部分,但它们仍然需要在项目中显示为成员。我一直在尝试各种连接和子查询,但没有成功。我基本上需要项目中的成员列表,如果它们是类别的一部分,则显示他们对特定类别的能力。我觉得有一些方法可以做到这一点,但是我正在努力弥合一个灰色地带。

1 个答案:

答案 0 :(得分:0)

这个问题很模糊,所以我可以帮你解决错误的问题,但是如果你想列出一个特定项目的所有成员(无论他们的能力如何),并列出列出的指定类别的能力,那么:

SELECT project_memberships.user_id
   , category_members.category_id AS category
   , category_members.capability AS capability

FROM project_members
   LEFT OUTER JOIN categories
       ON project_members.project_id = categories.project_id
   LEFT OUTER JOIN category_members
       ON categories.id = category_members.category_id
       AND category_members.user_id_added = project_membership.user_id
   WHERE project_members.project_id = $project_id
   AND (categories.id = $category_id OR categories.id IS NULL);

应该得到你。

与原始查询相比,我更改了树状物:

  1. 我使用的是表名,因为它们比“a,b,c”
  2. 更有说服力
  3. 我向第二个联接添加了附加约束category_members.user_id_added = project_membership.user_id,以便不将其他用户的category_members加入project_members记录。
  4. 我放宽了WHERE条件,以便还显示不具备所需功能的成员。对于这些记录,categorycapability将为NULL
  5. 关于你必须加入三个表的问题答案是肯定的,你需要这样做。