Mysql подзапрос с между - PullRequest
       36

Mysql подзапрос с между

0 голосов
/ 08 апреля 2011

Я работаю с ACL в CakePHP и хотел бы получить все записи, которые разрешены для текущего пользователя.

Упрощенно, у меня есть две таблицы:

Интервал:

**lft**| **rght**
10   |  20
40   |  60
90   |  92

Acos:

**foreign_key** | **lft** | **rght**
3               |    15   |  17
4               |    25   |  27
5               |    45   |  47
6               |    49   |  51
7               |    81   |  83

Теперь я хотел бы извлечь из ACOS foreign_keys, которые имеют значения lft и rght между lft и rght из Interval

В приведенном вышеНапример, мы получаем Foreign_key 3, 5, 6.

На заметку.Таблица «Interval» фактически не существует.Значения получены из этого запроса (также таблицы 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 ]

1 голос
/ 08 апреля 2011
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 голос
/ 08 апреля 2011

Вы можете присоединиться к таблицам следующим образом:

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 находится в пределах или равен диапазону интервала, без перехода.

Если есть несколько совпадающих интервалов, вы получите несколько строк в результате. Используйте GROUP BY или DISTINCT, чтобы получить только внешний ключ.

...