У меня есть пять таблиц:
- tab_template
- template_group
- группа
- user_group
- Пользователь
Tab_template организованы в группы с реляционной таблицей template_group.
Пользователи организованы в группы с реляционной таблицей user_group.
Группы могут быть общими или частными (используя логический столбец tinyint в таблице).
Я хочу запросить все tab_templates, которые либо:
- В той же группе, что и пользователь
- или в публичной группе
Вот мой текущий запрос:
ВЫБРАТЬ * ИЗ 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
НА ИСТИНЕ
ГДЕ
group
. * * = Тысяча сорок-девять 0
OR
(template_group
. group_id
= user_group
. group_id
И
* * Тысяча пятьдесят восемь. user_id
= 2)
GROUP BY t
. id
;
Это работает, и это не СУПЕР медленно, само по себе, но это отвратительно, как я присоединяюсь к таблице user_group.
Проблема в том, что мне нужно присоединиться к таблице user_group для условной проверки, но мне нужно выполнить эту условную проверку, только если группа не является частной.
Я знаю, что вместо третьего LEFT JOIN с условием ON TRUE я мог бы добавить еще одну таблицу в предложение FROM (FROM tab_template
t
, user_group
ug
) ... но я не могу Сделайте это, потому что, как класс Yii ActiveRecord работает с DcCriteria, я не могу изменить эту часть выражения. Я могу редактировать практически любую другую часть запроса, но не предложение FROM. Проверьте API здесь: http://www.yiiframework.com/doc/api/CDbCriteria Так вот почему я присоединяюсь к таблице user_group таким, какой я есть. Некоторые эксперты по Yii могли бы помочь мне решить эту проблему, но я не уверен, что мой запрос будет быстрее, если в любом случае использовать FROM вместо таблиц.
Любая помощь будет принята с благодарностью! Спасибо