【问题标题】:Mysql subquery with betweenMysql子查询之间
【发布时间】:2011-04-11 04:40:55
【问题描述】:

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

现在我想从 Acos 中获取 lft 和 rght 值在间隔的 lft 和 rght 之间的 foreign_keys

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

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

【问题讨论】:

    标签: mysql cakephp subquery acl between


    【解决方案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
    

    【讨论】:

    • 谢谢。您有什么方法可以优化上述内容吗?
    【解决方案2】:

    你可以像这样加入表格:

    SELECT foreign_key from Acos a INNER JOIN Interval i ON
      (i.lft <= a.lft AND i.rght>=a.rght)
    

    连接条件(i.lft &lt;= a.lft AND i.rght&gt;=a.rght)保证Acos中的范围在或等于Interval的范围内,不超过。

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

    【讨论】:

    • 感谢您的帮助。一开始我不能让你做例子,所以我接受了 arturr 的回答——尽管你的回答非常相似。我通过添加“distinct”使其工作: SELECT distinct foreign_key from Acos a INNER JOIN Interval i ON (i.lft =a.rght)
    • 很高兴你让它工作了 - 我猜你没有看到我的最后一段,我提到使用 Distinct? :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多