我已经编写了一组sql查询,并在我的网站上正常工作。
现在,我想在所有这些查询中添加'where common condition clause'。 我不想用这个附加条件重写我的所有查询,而是我喜欢做一些事情,从现在开始它会自动应用于我的数据库上运行的所有查询。
有没有这样的方法可以做到这一点?
我的数据库:MYSQL
我的网站:PHP,YII
答案 0 :(得分:1)
使用视图可能有办法解决此问题。假设您对表单有疑问:
select . . .
from table1 t1 . . .
你现在想要:
select . . .
from table1 t1 . . .
where t1.field = 'x'
您可以通过执行以下步骤来解决此问题:
将table1
重命名为某个内容(例如_table1
):
rename table table1 to _table1;
创建名为table1
的视图:
create view table1 as
select *
from _table1
where field = 'x';
一般来说,我认为更改现有查询更好(并且MySQL中的视图可能会导致优化问题)。但是,在某些情况下,这种方法可能适合快速获得所需的更改。
答案 1 :(得分:0)
好吧,你可以使用子查询。说你有:
select * from table1 where field1="banana"
你可以将它包装在子查询中
select * from ([old query]) t_sub where fieldx='Y'
这样你就得到了
select * from (select * from table1 where field1="banana") t_sub where fieldx='Y'
但是,您需要重新分析查询/索引,因为您可能会受到重大性能影响。
正如Gordon Linoff所说,从头开始重做查询要好得多。
答案 2 :(得分:0)
你的问题有点受限。我不知道你是否希望更频繁地发生这样的变化。如果没有,那么只需更改查询并完成它。如果预期有更多更改,您可以创建一个包含在查询中设置的“全局变量”的简单表。那么你可以从那时起同时为所有查询维护它们。
简单的例子:
SELECT * FROM Table
WHERE (SELECT GlobalVar FROM VarTable)
你可以从那里看到它,在脚本中识别你的查询并在变量表中引用这个标识。 (在子选择中的位置)
无论如何,希望这对你有所帮助!
答案 3 :(得分:0)
也许这可以帮助你THE DEFINITIVE GUIDE TO YII。
默认范围
模型类可以具有默认范围,该范围将应用于有关模型的所有查询(包括关系查询)。例如,支持多种语言的网站可能只想显示当前用户指定语言的内容。因为可能有很多关于站点内容的查询,我们可以定义一个默认范围来解决这个问题。为此,我们重写CActiveRecord :: defaultScope方法,如下所示,
class Content extends CActiveRecord
{
public function defaultScope()
{
return array(
'condition'=>"language='".Yii::app()->language."'",
);
}
}