我之前问过一个关于建模 MySQL 数据建模帮助的问题。建议是标记为角色和发起人的多个表的图表。
现在我正在尝试编写查询并在苦苦挣扎。这就是我一直放弃并寻找可能更简单的数据库模型的地方,但现在我知道这行不通,我需要一些建议。
当我有一个 event_id 和一个 user_id 时,我需要检查是否允许此领导者编辑此事件。如果他们被允许
如果在活动、项目或赞助活动或项目的组织的任何这些领导职位中找到此 user_id,则此用户/领导可以编辑。
我不确定如何编写如此复杂的查询。以下查询坚持 user_id 存在于所有三个 user_role 表中,而它只需要出现在一个表中。
SELECT count(*)
FROM user AS u
JOIN user_event_role AS uer ON (uer.user_id=u.id)
JOIN user_project_role AS upr ON (upr.user_id=uer.id)
JOIN user_organization_role AS uor ON (uor.user_id=upr.user_id)
JOIN event_sponsor AS es ON (es.organization_id=uor.organization_id)
JOIN project_sponsor AS ps ON (ps.project_id=upr.project_id)
WHERE
uer.term_to >= CURRENT_DATE() AND
upr.term_to >= CURRENT_DATE() AND
uor.term_to >= CURRENT_DATE() AND
u.netid='{$netid}'
Run Code Online (Sandbox Code Playgroud)
我是否需要做一些像这个工会一样复杂的事情:
SELECT count(*)
FROM user AS u
JOIN user_event_role AS uer ON (uer.user_id=u.id)
WHERE
uer.event_id=$event_id AND
uer.term_to >= CURRENT_DATE() AND
uer.role != 'volunteer' AND
u.netid='{$netid}'
UNION
SELECT count(*)
FROM user AS u
JOIN user_project_role AS upr ON (upr.user_id=u.id)
JOIN event AS e ON (e.project_id=upr.project_id)
WHERE
e.id=$event_id AND
upr.term_to >= CURRENT_DATE() AND
u.netid='{$netid}'
UNION
SELECT count(*)
FROM user AS u
JOIN user_organization_role AS uor ON (uor.user_id=u.id)
JOIN event_sponsor AS es ON (es.organization_id=uor.organization_id)
WHERE
e.id=$event_id AND
uor.term_to >= CURRENT_DATE() AND
u.netid='{$netid}'
UNION
SELECT count(*)
FROM user AS u
JOIN user_organization_role AS uor ON (uor.user_id=u.id)
JOIN project_sponsor AS ps ON (ps.organization_id=uor.organization_id)
WHERE
uer.event_id=$event_id AND
uor.term_to >= CURRENT_DATE() AND
u.netid='{$netid}'
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?有没有办法简化它?