Mysql子查询之间

时间:2011-04-08 17:07:05

标签: mysql cakephp subquery acl between

我正在使用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' )
 )

我不希望上面的例子太乱了。如果有任何不确定因素,请评论。 提前谢谢!

2 个答案:

答案 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