我正在使用CakePHP中的ACL,并希望获取当前用户允许的所有条目。
简化,我有两张桌子:
间隔:
**lft**| **rght**
10 | 20
40 | 60
90 | 92
反余弦:
**foreign_key** | **lft** | **rght**
3 | 15 | 17
4 | 25 | 27
5 | 45 | 47
6 | 49 | 51
7 | 81 | 83
现在我想从Interval
获取在lft和rght之间具有lft和rght值的外部键来自Acos在上面的例子中,我们得到foreign_key 3,5,6。
旁注。 “间隔”表实际上并不存在。值来自此查询(也是acos表):
SELECT lft, rght FROM acos WHERE id IN (
SELECT aco_id FROM aros_acos WHERE
aro_id = (SELECT parent_id FROM aros WHERE foreign_key = 48 && model = 'User' )
OR
aro_id = (SELECT id FROM aros WHERE foreign_key = 48 && model = 'User' )
)
我不希望上面的例子太乱了。如果有任何不确定因素,请评论。 提前谢谢!
答案 0 :(得分:1)
您可以像这样加入表:
SELECT foreign_key from Acos a INNER JOIN Interval i ON
(i.lft <= a.lft AND i.rght>=a.rght)
连接条件(i.lft <= a.lft AND i.rght>=a.rght)
确保Acos中的范围在Interval的范围内或等于Interval的范围,而不会过度。
如果有多个匹配间隔,您将在结果中获得多行。使用GROUP BY或DISTINCT只获取外键。
答案 1 :(得分:1)
select distinct foreign_key
from Acos
join
(
SELECT lft, rght
FROM acos
WHERE
id IN (
SELECT aco_id
FROM
aros_acos a,
(
select parent_id, id
from aros
where foreign_key = 48 && model = 'User'
) x
WHERE
a.aro_id = x.id
OR a.aro_id = x.parent_id
)
) Interval
on
Acos.lft>=Interval.lft
and acos.rght<=Interval.rght