2012-03-15 41 views
1

我是一个在zend中开发,并有一个相当大的mysql查询。查询工作正常,我得到我期望的列表。我正在使用Select-> Where ....来执行此操作。以下是查询。从一个大的MySQL查询(zend)计数行

SELECT DISTINCT `d`.* FROM `deliverable` AS `d` INNER JOIN `groups` AS `g1` ON d.id = g1.deliverable_id INNER JOIN `groupmembers` AS `gm1` ON g1.id = gm1.group_id LEFT JOIN `connection` AS `c` ON d.id = c.downstreamnode_id LEFT JOIN `deliverable` AS `d1` ON c.upstreamnode_id = d1.id INNER JOIN `deliverable` AS `d2` ON CASE WHEN d1.id IS NULL THEN d.id ELSE d1.id END = d2.id INNER JOIN `groups` AS `g` ON d2.id = g.deliverable_id INNER JOIN `groupmembers` AS `gm` ON g.id = gm.group_id WHERE (g1.group_type = 100) AND (gm1.member_id = 1) AND (c.downstreamnode_id IS NULL OR d.restrict_access = 1) AND (g.group_type = 100 OR g.group_type = 110) AND (gm.member_id = 1) AND (d.deliverable_type = 110 OR d.deliverable_type = 100) GROUP BY CASE WHEN c.downstreamnode_id IS NULL THEN d.id ELSE c.downstreamnode_id END 

唯一的问题是当我尝试计算mysql查询中的行时,我只得到1返回。下面是查询

SELECT DISTINCT count(*) AS `rowCount` FROM `deliverable` AS `d` INNER JOIN `groups` AS `g1` ON d.id = g1.deliverable_id INNER JOIN `groupmembers` AS `gm1` ON g1.id = gm1.group_id LEFT JOIN `connection` AS `c` ON d.id = c.downstreamnode_id LEFT JOIN `deliverable` AS `d1` ON c.upstreamnode_id = d1.id INNER JOIN `deliverable` AS `d2` ON CASE WHEN d1.id IS NULL THEN d.id ELSE d1.id END = d2.id INNER JOIN `groups` AS `g` ON d2.id = g.deliverable_id INNER JOIN `groupmembers` AS `gm` ON g.id = gm.group_id WHERE (g1.group_type = 100) AND (gm1.member_id = 1) AND (c.downstreamnode_id IS NULL OR d.restrict_access = 1) AND (g.group_type = 100 OR g.group_type = 110) AND (gm.member_id = 1) AND (d.deliverable_type = 110 OR d.deliverable_type = 100) GROUP BY CASE WHEN c.downstreamnode_id IS NULL THEN d.id ELSE c.downstreamnode_id END 

我产生这种从使用相同的“选择”生成第一查询,但我重置的列和添加数。

$this->getAdapter()->setFetchMode(Zend_Db::FETCH_ASSOC); 
    $select 
     ->reset(Zend_Db_Select::COLUMNS) 
     ->columns(array('count('.$column.') as rowCount')); 
    $rowCount = $this->getAdapter()->fetchOne($select); 

此方法适用罚款全部我的其他查询只有这一个我有麻烦。我怀疑它有些事情要做,因为我在第一个查询中得到了正确的行,这很奇怪。有任何想法吗。谢谢。

以下FYI是我成功工作的两个查询。

SELECT DISTINCT `po`.* FROM `post` AS `po` INNER JOIN `postinfo` AS `p` ON po.postinfo_id = p.id WHERE (p.creator_id = 1) ORDER BY `p`.`date_created` DESC 

SELECT DISTINCT count(*) AS `rowCount` FROM `post` AS `po` INNER JOIN `postinfo` AS `p` ON po.postinfo_id = p.id WHERE (p.creator_id = 1) ORDER BY `p`.`date_created` DESC 

在这一个我有4行返回在第一个查询和'int 4'返回第二个。有谁知道为什么它不适用于大查询?

回答

0

移动您的DISTINCT

SELECT COUNT(DISTINCT `po`.*) AS `rowCount` ... 
+0

谢谢,但它没有奏效。只是为了确认下面的代码按预期工作。 SELECT DISTINCT count(*)AS'rowCount' FROM'post' AS'po' 即使是不同的地方,它是我发布的另一个查询,我遇到了麻烦。我甚至试图摆脱这些独特的一切,但没有运气仍然返回1.任何其他的想法?谢谢 – viciouskinid 2012-03-15 22:18:09

+0

您提到的第二项查询工作可能不符合您的期望。 'SELECT DISTINCT count(*)'将计算所有行,而不仅仅是唯一的行,然后返回1行作为结果。然后'DISTINCT'会将其过滤为只有唯一的行,但由于只有一行被返回(计数),所以无法包含“DISTINCT”。如果您想计算不同的行,您必须将“DISTINCT”放置在“COUNT”内。 – Interrobang 2012-03-15 22:33:28

0

好琢磨出来这是GROUP BY这是造成只有1结果返回。感谢Interrobang为您提供帮助,我确信使用DISTINCT不正确会在未来导致我头痛。

0

请尝试在查询中使用SQL_CALC_FOUND_ROWS? http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

使用SQL_CALC_FOUND_ROWS是特定于mysql的,但即使在您的初始查询包含限制时获得完整记录计数也是相当不错的。一旦获得计数,不要在随后的额外记录查询中包含SQL_CALC_FOUND_ROWS,因为这会对查询造成额外的负担。

您最初的查询是:

SELECT SQL_CALC_FOUND_ROWS DISTINCT `d`.* FROM `deliverable` AS `d` INNER JOIN `groups` ... 

你必须做一个后续调用后您的初始查询执行做一个SELECT FOUND_ROWS()得到计数。

如果你做了一点搜索,你会发现有人扩展了Zend_Db_Select来包含这个能力。