MySQL - 一次向所有查询添加常见的WHERE条件。

时间:2014-04-18 10:13:01

标签: php mysql sql yii

我已经编写了一组sql查询,并在我的网站上正常工作。

现在,我想在所有这些查询中添加'where common condition clause'。 我不想用这个附加条件重写我的所有查询,而是我喜欢做一些事情,从现在开始它会自动应用于我的数据库上运行的所有查询。

有没有这样的方法可以做到这一点?

我的数据库:MYSQL

我的网站:PHP,YII

4 个答案:

答案 0 :(得分:1)

使用视图可能有办法解决此问题。假设您对表单有疑问:

select . . .
from table1 t1 . . .

你现在想要:

select . . .
from table1 t1 . . .
where t1.field = 'x'

您可以通过执行以下步骤来解决此问题:

  1. table1重命名为某个内容(例如_table1):

    rename table table1 to _table1;
    
  2. 创建名为table1的视图:

    create view table1 as
    select *
    from _table1
    where field = 'x';
    
  3. 一般来说,我认为更改现有查询更好(并且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."'",
        );
    }
}