1

我正在尝试构建一个工具来帮助我的团队计划活动。解释我的问题的部分图表:

图表

大图

ActionshasManyTeams通过 hasManyThrough ( ) 具有不同的角色(即 Lead、Secondary actions_teams

Actions通过 hasManyThrough ( linkages)链接到父/子关系中的其他操作

要求: 对于给定的Action. 在给定角色中id有附加 ( actions_team) (s) 的,这些(s) 是否有back to 。(即列出.作为 中的父级)?TeamTeamlinkageActionidActionidlinkages

我已经想出了如何在控制器甚至视图中通过使用循环和/或Containable能够高度控制返回的数据来做到这一点。但是,我会经常问这个问题,所以我宁愿以某种方式在数据库本身中实现它。

我需要的关系似乎是 2 个连接表的连接表?(actions_teamslinkages)。或者是使用的解决方案counterCache?我被困住了。

任何建议或提示将不胜感激。蒂亚!

4

1 回答 1

1

必须假设链接只有 1 级(即,我们不能从子级检查超出其父级。如果您给定的 action_id 是团队行动的祖父母或曾祖父母,这将不起作用。)而不是使用(可能)派生表、子选择等创建 1 个巨大的 SQL 语句,从建立“潜在团队列表”的视图开始。

在不查看实际数据的情况下,创建此视图以确保有一个不同的列表(如果这三个字段包含唯一索引,您可能可以避免此视图。)

CREATE VIEW vw_team_listing AS
SELECT DISTINCT team_id, action_id, action_role_id
FROM actions_teams;

{案例陈述是因为你问,“团队有联系吗?” 您可以为那些有或没有链接(不是两者)的团队创建一个选择语句}

SELECT vw_team_listing.team_id AS team_id,
CASE
WHEN EXISTS(
SELECT *
FROM linkages
JOIN actions_teams
ON linkages.child_action_id = action_teams.action_id
WHERE linkages.parent_id = vw_team_listing.action_id
AND actions_teams.team_id = vw_team_listing.team_id
)
THEN 'Linked'
ELSE 'Not Linked'
END AS answer
FROM vw_team_listing
WHERE vw_team_listing.action_id = 'GIVEN_ACTION_ID'
AND vw_team_listing.action_role_id = 'GIVEN_ACTION_ROLE_ID';
于 2013-09-18T11:44:23.087 回答