计算大型mysql查询(zend)中的行数

计算大型mysql查询(zend)中的行数,mysql,zend-framework,zend-db-select,Mysql,Zend Framework,Zend Db Select,我是在zend中开发的,有一个相当大的mysql查询。查询工作正常,我得到了我期望的列表。我正在使用选择->何处。。。。下面是查询 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

我是在zend中开发的,有一个相当大的mysql查询。查询工作正常,我得到了我期望的列表。我正在使用选择->何处。。。。下面是查询

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
我使用与生成第一个查询相同的“select”来生成它,但我重置了列并添加了count-in

$this->getAdapter()->setFetchMode(Zend_Db::FETCH_ASSOC);
    $select
        ->reset( Zend_Db_Select::COLUMNS)
        ->columns(array('count('.$column.') as rowCount'));
    $rowCount = $this->getAdapter()->fetchOne($select);
这个方法适用于我所有的其他查询,只有这个我有问题。我怀疑它与我的“CASE”有关,但这很奇怪,因为我在第一个查询中得到了正确的行。任何想法。谢谢

以下是我成功处理的两个查询

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行,在第二个查询中返回了“int4”。有人知道为什么它对大查询不起作用吗?

移动你的
DISTINCT

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

好的,我发现是GROUP BY只返回了1个结果。感谢Interrobang为您提供的帮助,我确信不正确地使用DISTINCT将在将来引起我的头痛。

是否尝试在查询中使用SQL\u CALC\u FOUND\u行?

使用SQL\u CALC\u FOUND\u行是特定于mysql的,但即使初始查询包含限制,也可以获得完整的记录计数。获得计数后,不要在后续查询中包含SQL\u CALC\u FOUND\u行以获取额外记录,因为这将导致查询的额外负载

您的初始查询将是:

SELECT SQL_CALC_FOUND_ROWS  DISTINCT `d`.* FROM `deliverable` AS `d` INNER JOIN `groups` ...
在执行初始查询后,您必须执行后续调用,通过执行
选择FOUND\u ROWS()
来获取计数


如果您进行一点搜索,您会发现有人扩展了Zend_Db_Select以包含此功能。

谢谢,但它不起作用。仅确认以下代码按预期工作。从
post
AS
po
中选择DISTINCT count(*)作为
rowCount
,即使在有DISTINCT的情况下,我发布的另一个查询也会遇到问题。我甚至试着一起把这个独特的东西去掉,但是运气还是不好。还有其他想法吗?谢谢你提到的第二个问题可能没有达到你的预期效果
selectdistinct count(*)
将计算所有行,而不仅仅是唯一的行,然后返回1行作为结果。然后
DISTINCT
将只过滤到唯一的行,但是由于只返回一行(计数),因此包含
DISTINCT
没有帮助。如果要对不同的行进行计数,则必须将
distinct
放在
count
内。