私は5つのテーブルを持っています:
- tab_template
- template_group
- グループ
- ユーザー・グループ
- ユーザー
Tab_templateは、template_groupリレーショナルテーブルを使用してグループに編成されます。ユーザーは、user_groupリレーショナルテーブルを使用してグループに編成されます。グループはパブリックまたはプライベートにすることができます(テーブルのtinyintブール列を使用)。
次のいずれかであるすべてのtab_templatesを照会したいと思います。
- ユーザーと同じグループ内
- またはパブリックグループで
これが私の現在のクエリです:
SELECT *
FROM tab_template
t
LEFTJOINON 。= 。
左に参加し
ます。= 。
左から真
の場所に
参加します。= 0
OR
(。= 。
AND 。= 2)
GROUPBY 。; template_group
template_group
tab_template_id
t
id
group
template_group
tab_template_id
group
id
user_group
group
private
template_group
group_id
user_group
group_id
user_group
user_id
t
id
それは機能し、それ自体はSUPER遅いわけではありませんが、user_groupテーブルに参加する方法はハックです。
問題は、条件付きチェックのためにuser_groupテーブルに参加する必要があることですが、グループがプライベートでない場合にのみ、その条件付きチェックを実行する必要があります。
ONTRUE条件の3番目のLEFTJOINの代わりに、FROM句(FROM tab_template
t
、user_group
ug
)に別のテーブルを追加できることは知っていますが、YiiのActiveRecordクラスがDcCriteriaで機能するため、これはできません。 tステートメントのその部分を変更します。クエリの他の部分は編集できますが、FROM句は編集できません。ここでAPIをチェックしてください:http : //www.yiiframework.com/doc/api/CDbCriteriaだから、私は自分のようにuser_groupテーブルに参加しています。Yiiの専門家の中には、私がその問題を解決するのを手伝ってくれる人もいるかもしれませんが、とにかくテーブルを結合するのではなく、テーブルをFROMすることで、クエリが高速になるかどうかはわかりません。
どんな助けでも大歓迎です!ありがとう