間のmysqlサブクエリ

acl between cakephp mysql subquery
間のmysqlサブクエリ

CakePHPでACLを使用していますが、現在のユーザーに許可されているすべてのエントリを取得したいと思います。

簡略化すると、2つのテーブルがあります。

間隔:

**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の値を持つforeign_keysを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  0


ベストアンサー

次のようにテーブルを結合できます。

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の範囲内であることを保証します。

一致する間隔が複数ある場合、結果に複数の行が表示されます。 GROUP BYまたはDISTINCTを使用して、外部キーのみを取得します。

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

1


タイトルとURLをコピーしました