gpt4 book ai didi

sql - 在多个表上执行条件 mysql 连接的最有效方法? (Yii php框架)

转载 作者:行者123 更新时间:2023-11-29 01:01:08 25 4
gpt4 key购买 nike

我有五个表:

  1. tab_template
  2. 模板组
  3. 用户组
  4. 用户

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

我想查询所有 tab_templates 是:

  1. 与用户同组
  2. 或在公共(public)组中

这是我当前的查询:

SELECT * FROM tab_template t
左连接 template_group
ON template_group.tab_template_id=t.id
左加入
ON template_group.tab_template_id=group.id
左加入 user_group
真实
在哪里
.私有(private)=0
或者
(template_group.group_id=user_group.group_id

user_group.user_id=2)
GROUP BY t.id;

它有效,而且它本身并不是 super 慢,但它是我加入 user_group 表的方式。

问题是我需要加入 user_group 表进行条件检查,但如果该组不是私有(private)的,我只需要执行该条件检查。

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

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

最佳答案

对于此类情况,我的建议是使用 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

更易于阅读,从而更易于维护。

关于sql - 在多个表上执行条件 mysql 连接的最有效方法? (Yii php框架),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com