我有五個表:在多個表上執行條件mysql連接的最有效方法? (Yii的PHP框架)
- tab_template
- template_group
- 組
- USER_GROUP
- 用戶
Tab_template的組織成與template_group關係組表。 用戶與user_group關係表組成用戶組。 羣組可以是公共或私人的(在表格中使用tinyint布爾列)。
我想查詢所有要麼是tab_templates的:
- 在同一個組的用戶
- 或在公共組
這裏是我當前的查詢:
SELECT * FROM tab_template
t
LEFT JOIN template_group
ON template_group
。 tab_template_id
= t
。 id
LEFT JOIN group
ON template_group
。 tab_template_id
= group
。 id
LEFT JOIN user_group
ON TRUE
WHERE
group
。 private
= 0
OR
(template_group
。group_id
= user_group
。group_id
AND
user_group
。user_id
= 2)
GROUP BY t
。 id
;
它的工作原理,它本身並不是超慢的,但是我加入user_group表的方式很不方便。
問題是,我需要加入user_group表進行條件檢查,但我只需要做這種條件檢查,如果該組不是私人的。
我知道的,而不是第三LEFT JOIN即與真條件我可以FROM子句中的另一個表添加到(FROM tab_template
t
,user_group
ug
)...但我不能這樣做,因爲這樣的Yii的ActiveRecord類與DcCriteria一起使用我無法修改該語句的這一部分。我可以編輯查詢的任何其他部分,但不能編輯FROM子句。看看這裏的API:http://www.yiiframework.com/doc/api/CDbCriteria所以這就是爲什麼我加入user_group表的方式。Yii的一些專家或許能夠幫助我解決這個問題,但是我不確定我的查詢會從表中刪除而不是加入它們,從而加快查詢速度。
任何幫助將不勝感激!由於
這看起來很不錯,但不幸的是我不能使用Yii的ActiveRecord類的「UNION」 – thaddeusmt 2010-06-25 18:58:42
@thaddeusmt:Boooooo。我改變了社區wiki的答案,所以我可以把它作爲一個例子 – 2010-06-25 19:04:21