帮助处理复杂的 MySQL 查询

dac*_*dac 5 mysql query

我之前问过一个关于建模 MySQL 数据建模帮助的问题。建议是标记为角色和发起人的多个表的图表。角色和发起人的多个表

现在我正在尝试编写查询并在苦苦挣扎。这就是我一直放弃并寻找可能更简单的数据库模型的地方,但现在我知道这行不通,我需要一些建议。

当我有一个 event_id 和一个 user_id 时,我需要检查是否允许此领导者编辑此事件。如果他们被允许

  • user_id 和 event_id 是否在 user_event_role 表中?
  • 如果这个事件也有project_id,那么user_project_role 表中的用户是运行这个事件的项目吗?
  • 该用户是否在赞助该项目的组织的 user_organization_role 表中(检查 project_sponsor 表)?
  • 该用户是否在赞助此活动的组织的 user_organization_role 表中(检查 event_sponsor 表)?

如果在活动、项目或赞助活动或项目的组织的任何这些领导职位中找到此 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)

这是最好的方法吗?有没有办法简化它?

Mic*_*nny 2

这是使用Views的完美情况。我将创建一个名为viewEditableEvents的视图,它仅过滤那些可由领导者编辑的事件。然后您可以针对该视图编写 SQL 查询。