1

我有五张桌子:

  1. tab_template
  2. 模板组
  3. 团体
  4. 用户组
  5. 用户

Tab_template 使用 template_group 关系表组织成组。使用 user_group 关系表将用户组织成组。组可以是公共的或私有的(使用表中的 tinyint 布尔列)。

我想查询所有 tab_templates 是:

  1. 与用户在同一组中
  2. 或在公共组中

这是我当前的查询:

SELECT * FROM tab_template t
LEFT JOIN template_group
ON template_grouptab_template_id= tid
group
加入template_grouptab_template_id= groupid
LEFT JOIN user_group
ON TRUE
WHERE
groupprivate=0
OR
( template_group. group_id= user_group. group_id
AND
user_group. user_id=2)
分组tid;

它可以工作,而且它本身并不是超级慢,但是我加入 user_group 表的方式很hacky。

问题是我需要加入 user_group 表进行条件检查,但我只需要在组不是私有的情况下进行条件检查。

我知道我可以将另一个表添加到 FROM 子句 (FROM tab_template t, user_group ug) 中,而不是第三个 LEFT JOIN 与 ON TRUE 条件...但我不能这样做,因为 Yii 的 ActiveRecord 类与 DcCriteria 一起工作的方式我可以' t 修改语句的那部分。我可以编辑查询的任何其他部分,但不能编辑 FROM 子句。在此处查看 API:http ://www.yiiframework.com/doc/api/CDbCriteria 所以这就是我以我的方式加入 user_group 表的原因。一些 Yii 专家可能能够帮助我解决这个问题,但我不确定我的查询是否会通过 FROMing 表而不是 JOINing 来更快。

任何帮助将不胜感激!谢谢

4

2 回答 2

1

我对此类情况的建议是使用 UNION:

SELECT t.* 
  FROM TAB_TEMPLATE t
  JOIN TEMPLATE_GROUP tg ON tg.tab_template_id = t.id
  JOIN GROUP g ON g.id = tg.tab_template_id  
              AND g.private = 0
UNION 
SELECT t.* 
  FROM TAB_TEMPLATE t
  JOIN TEMPLATE_GROUP tg ON tg.tab_template_id = t.id
  JOIN GROUP g ON g.id = tg.tab_template_id  
              AND g.private != 0
  JOIN USER_GROUP ug ON ug.group_id = g.id

更容易阅读,这使得它更容易维护。

于 2010-06-24T18:33:25.427 回答
0

我这台机器上没有mySql,所以无法测试:

SELECT
    TT.col1,
    TT.col2,
    ...
FROM
    Tab_Templates TT
WHERE
    EXISTS
    (
        SELECT *
        FROM
            Template_Groups TG
        WHERE
            TG.tab_template_id = TT.id AND
            TG.private = 0
    ) OR
    EXISTS
    (
        SELECT *
        FROM
            User_Groups UG
        INNER JOIN Template_Groups TG2 ON
            TG2.tab_template_id = TT.id AND
            TG2.group_id = UG.group_id
        WHERE
            UG.user_id = 2
    )
于 2010-06-24T18:30:06.213 回答