我已经尝试了好几个小时才能得到这个。我仍然是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)的方法。我运行的查询几乎可以工作,但用户功能没有正确返回。我使用左外连接作为成员可能并不总是属于类别的一部分,但它们仍然需要在项目中显示为成员。我一直在尝试各种连接和子查询,但没有成功。我基本上需要项目中的成员列表,如果它们是类别的一部分,则显示他们对特定类别的能力。我觉得有一些方法可以做到这一点,但是我正在努力弥合一个灰色地带。
答案 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);
应该得到你。
与原始查询相比,我更改了树状物:
category_members.user_id_added = project_membership.user_id
,以便不将其他用户的category_members加入project_members记录。WHERE
条件,以便还显示不具备所需功能的成员。对于这些记录,category
和capability
将为NULL
。 关于你必须加入三个表的问题答案是肯定的,你需要这样做。