【问题标题】:How to make union all command using Yii framework command DAO object如何使用 Yii 框架命令 DAO 对象进行联合所有命令
【发布时间】:2014-11-27 15:04:48
【问题描述】:

我正在尝试将几个表数据合并到一个查询中。我正在使用 Yii 框架(v1.15)。我已经这样做了,而且效果很好:

$command = Yii::app()->db->createCommand();
$command->select('something')->from('somewhere');
$command->union($sql);

这会产生这样的结果:

从某个联合中选择一些东西(选择 ....)

但 union 合并了重复的行值。我需要使用UNION ALL 合并所有数据,但在 documentation.

也许你们中的一些人如何使用 yii 数据库对象来做到这一点? 谢谢

【问题讨论】:

    标签: php mysql yii union union-all


    【解决方案1】:

    在 Yii 1.x.x 的查询构建器中,不支持 UNION ALL。您可以将其更改为:

    Yii::app()->db->createCommand("SELECT something FROM somewhere UNION ALL({$sql})");
    

    另一种方法是在CDbCommand 命令中覆盖union()buildQuery() 方法,或者通过继承CDbCommand 创建unionAll() 方法。


    另一种方式是:

    $sql=Yii::app()->db->createCommand()->select('something')->from('somewhere')->union("SELECT something FROM somewhere")->getText();
    

    等于:

    SELECT `something` FROM `somewhere` UNION ( SELECT something FROM somewhere)
    

    然后:

    $sql=  str_replace('UNION', 'UNION ALL', $sql);
    

    或者使用正则表达式:

    $command->text = preg_replace('/\sUNION\s/', ' UNION ALL ', $command->text);
    

    等于:

    SELECT `something` FROM `somewhere` UNION ALL ( SELECT something FROM somewhere)
    

    然后,将其传递给createCommand() 方法。

    【讨论】:

    • 好吧,脏的方式会产生一些意想不到的结果,但它可能会节省一些时间,我想我会使用脏的方式,但使用preg_replace而不是str_replace并搜索整个单词,希望降低替换错误单词的可能性 :) 谢谢您的澄清
    • 在我的情况下,工会根本不起作用。当我执行$cmd1->union($cmd2->getText()) 时,$cmd2 中的参数有问题:Invalid parameter number: number of bound variables does not match number of tokens
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多