【问题标题】:Zend_Db_Select query with UNION and IN operatorZend_Db_Select 查询与 UNION 和 IN 运算符
【发布时间】:2012-04-13 14:48:33
【问题描述】:

如何使用 Zend_Db_Select 对象编写此查询?

SELECT
    `v1`.`id`,
    `v1`.`title`,
    `v1`.`duration`,
    `v1`.`img`
FROM 
    `videos` AS `v1` 
WHERE 
    v1.id IN (
        SELECT id_video FROM videos_categories WHERE id_video NOT IN(
            select id_video from videos_categories where id_category=34
            UNION
            select id_video from videos_categories where id_category=20
        )
    )

我尝试了类似的方法,但没有任何效果,我有一个错误页面。我使用数据映射器

$objQuery = $this->getDbTable()->select()
    ->from(array('v'=>'videos'),array('v.id','v.title','v.duration','v.img'))

$tableVC1 = new Application_Model_DbTable_VideosCategories(); 
$tableVC2 = new Application_Model_DbTable_VideosCategories();
$tableVC3 = new Application_Model_DbTable_VideosCategories();
$tableVC4 = new Application_Model_DbTable_VideosCategories();

// select id_video from videos_categories where id_category=20
$tableVC4->select()->from(array("vc"=>"videos_categories"),array("id_video"))
    ->where("vc.id_category=20");

// select id_video from videos_categories where id_category=34
$tableVC3->select()->from("videos_categories","id_video")
    ->where("id_category=34");

// union between previous queries
$tableVC2->select()->union(array($tableVC4,$tableVC3));

$tableVC1->select()->from("videos_categories","id_video")
    ->where("id_video NOT IN ?",$tableVC2);

$objQuery->where("v.id IN ?",$tableVC1);

谢谢你帮助我。

【问题讨论】:

  • 你有什么类型的“错误页面”?
  • 应用程序错误...什么都没有显示,我试图做一个 $objQuery->__toString() 但没有再次

标签: php sql zend-framework zend-db zend-db-table


【解决方案1】:

我的猜测是你试图将一个对象发送到你的联合,而它需要一个字符串。

试试这个:

$objQuery = $this->getDbTable()
                 ->select()
                 ->from(array('v' => 'videos'),
                        array('v.id', 'v.title', 'v.duration', 'v.img'))

$tableVC1 = new Application_Model_DbTable_VideosCategories(); 
$tableVC2 = new Application_Model_DbTable_VideosCategories();
$tableVC3 = new Application_Model_DbTable_VideosCategories();
$tableVC4 = new Application_Model_DbTable_VideosCategories();

// select id_video from videos_categories where id_category=20
$select4 = $tableVC4->select()
                    ->from(array("vc" => "videos_categories"),
                           array("id_video"))
                    ->where("vc.id_category=20");

// select id_video from videos_categories where id_category=34
$select3 = $tableVC3->select()
                    ->from("videos_categories", "id_video")
                    ->where("id_category=34");

// union between previous queries
$select2 = $tableVC2->select()
                    ->union(array($select4, $select3));

$select1 = $tableVC1->select()
                    ->from("videos_categories", "id_video")
                    ->where("id_video NOT IN ?", $select2);

$objQuery->where("v.id IN ?", $select1);

echo $objQuery; 应该会输出预期的查询。

【讨论】:

  • 谢谢莉亚莉!!!它有效......你能解释一下为什么现在它有效吗?我将相同的 obj 传递给 $select var
  • $select[1|2|3|4]Zend_Db_Select 的实例,它实现了__toString() 方法。如果您直接将 $tableVC1 传递给您的联合(或 where 子句),这意味着您正在尝试传递 Application_Model_DbTable_VideosCategories 的实例。
【解决方案2】:

您必须在 ? 周围加上括号。 => (?) ...并且变量必须是一个选择对象。

例如在这一行:

$tableVC2 = $xyz->select()...

$tableVC1->select()->from("videos_categories","id_video")
        ->where("id_video NOT IN (?)",$tableVC2);

【讨论】:

  • 我发布了另一个答案,也许这对你有帮助。
【解决方案3】:

尝试像这样构建您的 SELECT 语句,没有模型 - 它应该以这种方式工作:

$db = Zend_Db_Table::getDefaultAdapter();
$select = $db->select()
    ->from(
        // base table
    )
    ->joinLeft(
        // join sth
    )
    ->where('x = ?', $x)
    ->where('y = ?', $y)
    ->order('z DESC')
    ->limit(10, 0);
$q = $db->query($select);
$rowSet = $q->fetchAll();

【讨论】:

  • 我有超过 100 万条记录的数据库,问题是我需要 UNION 和 IN 运算符,同一个查询需要 2 分钟,而 IN 和 UNION 只需 0,020 秒
  • 我不是说你应该使用join's。我的意思是你应该使用这种构建你的选择语句。这样,您可以在另一个 select 语句的 where 方法调用中使用变量 $select(完整的选择对象)。如果您使用模型 Zend 抱怨表限制 - 根据我的经验。
猜你喜欢
  • 2012-05-21
  • 2019-12-05
  • 1970-01-01
  • 2012-01-03
  • 2013-02-05
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多