1

私は5つのテーブルを持っています:

  1. tab_template
  2. template_group
  3. グループ
  4. ユーザー・グループ
  5. ユーザー

Tab_templateは、template_groupリレーショナルテーブルを使用してグループに編成されます。ユーザーは、user_groupリレーショナルテーブルを使用してグループに編成されます。グループはパブリックまたはプライベートにすることができます(テーブルのtinyintブール列を使用)。

次のいずれかであるすべてのtab_templatesを照会したいと思います。

  1. ユーザーと同じグループ内
  2. またはパブリックグループで

これが私の現在のクエリです:

SELECT * FROM tab_template t
LEFTJOINON 。= 。 左に参加し ます。= 。 左から真 の場所に 参加します。= 0 OR (。= 。 AND 。= 2) GROUPBY 。; template_group
template_grouptab_template_idtid
group
template_grouptab_template_idgroupid
user_group


groupprivate

template_groupgroup_iduser_groupgroup_id

user_groupuser_id
tid

それは機能し、それ自体はSUPER遅いわけではありませんが、user_groupテーブルに参加する方法はハックです。

問題は、条件付きチェックのためにuser_groupテーブルに参加する必要があることですが、グループがプライベートでない場合にのみ、その条件付きチェックを実行する必要があります。

ONTRUE条件の3番目のLEFTJOINの代わりに、FROM句(FROM tab_template tuser_group ug)に別のテーブルを追加できることは知っていますが、YiiのActiveRecordクラスがDcCriteriaで機能するため、これはできません。 tステートメントのその部分を変更します。クエリの他の部分は編集できますが、FROM句は編集できません。ここでAPIをチェックしてください:http : //www.yiiframework.com/doc/api/CDbCriteriaだから、私は自分のようにuser_groupテーブルに参加しています。Yiiの専門家の中には、私がその問題を解決するのを手伝ってくれる人もいるかもしれませんが、とにかくテーブルを結合するのではなく、テーブルをFROMすることで、クエリが高速になるかどうかはわかりません。

どんな助けでも大歓迎です!ありがとう

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 に答える