2011-04-08 113 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