2011-04-08 111 views
0

我在CakePHP中使用ACL,并且想要获取当前用户允许的所有条目。Mysql子查询与

简化的,我有两个表:

间隔:

**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 

现在我想来从反余弦的foreign_keys具有之间LFT和rght值来自Interval的lft和rght

在上面的例子中,我们得到了forei gn_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') 
) 

我不希望上面的例子太乱。请评论是否有任何不确定性。 提前谢谢!

回答

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 
+0

谢谢。你看到有什么方法来优化上述? – sqren 2011-04-10 12:57:26

+0

我对它进行了一点优化。我希望这会起作用 – 2011-04-10 20:41:30

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)确保在反余弦该范围内或等于间隔的范围内,不能超出。

如果有多个匹配间隔,您将在结果中获得多行。使用GROUP BY或DISTINCT来获取外键。

+0

感谢您的帮助。起初我无法让你做一些示例工作,所以我接受了arturr的回答 - 尽管你的回答非常相似。 我通过添加“distinct”来使其工作: SELECT从Acos中选择不同的foreign_key一个INNER JOIN区间i ON (i.lft <= a.lft和i.rght> = a.rght) – sqren 2011-04-10 12:55:53

+0

很高兴您能够正常工作 - 我想你没有看到我最后一段,我提到了使用Distinct? :D – mdma 2011-04-10 19:57:06