我如何才能让Zend_Db仅从大型查询中选择一列?

| 我在SQL中有一个相当复杂的查询,该查询对两个表进行计数。查询应如下所示:
SELECT 
((SELECT COUNT(DISTINCT(pages.id)) AS `count` 
    FROM `pages` 
    INNER JOIN `pageRegions` ON pageRegions.pageId = pages.id 
    WHERE (MATCH (pages.name, pageRegions.contents) AGAINST (\'+keyword*\' IN BOOLEAN MODE))) + 
(SELECT COUNT(documents.id) AS `count` 
    FROM `documents` 
    INNER JOIN `files` ON files.id = documents.file 
    WHERE (MATCH (documents.name, 
              files.name, 
              files.extracted_text) AGAINST (\'+keyword*\' IN BOOLEAN MODE)))) AS count
不幸的是,当我使用Zend_Db编写以下代码时,查询中包含大量额外的列,因此两个查询的添加显然都失败了:
$total_count_select = $PagesTable->getAdapter()
    ->query(\'((\' . $pages_total_count_select . \') + 
              (\' . $legal_resources_total_count_select . \')
             ) AS count\');
其中
$pages_total_count_select
$legal_resources_total_count_select
都是
Zend_Db_Select
对象。 我尝试使用
columns()
方法在每个选择对象上指定所需的列,如下所示:
$legal_resources_total_count_select->columns(\'COUNT(documents.id) AS count\');
但这似乎只是追加到选择查询上,而不是仅返回指定的列。 因此,Zend生成的查询最终看起来像这样:
SELECT ((SELECT `pages`.*, 
                 ((1.3 * (MATCH(pages.name) AGAINST (\'+keyword*\' IN BOOLEAN MODE))) + 
                       (0.8 * (MATCH(pageRegions.contents) AGAINST (\'+keyword*\' IN BOOLEAN MODE)))) AS `score`, 
                     `pages`.`name` AS `page_name`, 
                     `pages`.`id` AS `page_id`, 
                     `pageRegions`.*, 
                     COUNT(DISTINCT(pages.id)) AS `count`
         FROM `pages`
         INNER JOIN `pageRegions` ON pageRegions.pageId = pages.id
         WHERE (MATCH (pages.name, pageRegions.contents) AGAINST (\'+keyword*\' IN BOOLEAN MODE))
         ORDER BY `score` DESC)

            + 

          (SELECT `documents`.*,
                   ((1.3 * (MATCH(documents.title) AGAINST (\'+keyword*\' IN BOOLEAN MODE))) + 
                       (0.8 * (MATCH(documents.short_description, files.NAME, files.extracted_text) AGAINST (\'+keyword*\' IN BOOLEAN MODE)))) AS `score`,
                     `files`.*, 
                    COUNT(documents.id) AS `count`
         FROM `documents`
         INNER JOIN `files` ON files.id = documents.file
         WHERE (MATCH (documents.title, documents.short_description, files.name, files.extracted_text) AGAINST (\'+keyword*\' IN BOOLEAN MODE))
         ORDER BY `score` DESC)
        ) AS COUNT
如何摆脱所有正在选择的额外列?     
已邀请:
您忘记了编写ѭ2construct和
$legal_resources_total_count_select
的代码的一部分。 您在构建这些参数的过程中错过了一个参数,该参数是您想要的列数组,如果不给它,它将占用表格*。 因此,只需检查创建select的方式并添加一个带有空数组的参数即可。 更新: 所以你也是:
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
重做一次之后,使用Zend_Db_Table(此处为$ this)重做一次
->from()
调用,您可以在此处指定列,因此可以使用一个空数组或唯一的数组:
$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->from($this, array(new Zend_Db_Expr(\'COUNT(documents.id) AS count\')));
    

要回复问题请先登录注册