问题描述
|
我在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.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\')));