Я развиваюсь в 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);
Этот метод отлично работает для всех мои другие вопросы только с этим, с которыми я столкнулся. Я подозреваю, что у него есть кое-что, чтобы сделать «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 строки, возвращенные в первом запросе, и «int 4» возвращается для второго. Кто-нибудь знает, почему он не работает для большого запроса?
Спасибо, но это не сработало. Просто чтобы подтвердить, что приведенный ниже код работает по назначению. SELECT DISTINCT count (*) AS 'rowCount' FROM' post' AS 'po' даже с отличием, где он находится, это другой запрос, который я опубликовал, с которым я столкнулся. Я даже попытался избавиться от различий все вместе, но не удача все еще вернулась 1. Любые другие идеи? Спасибо – viciouskinid
Второй из ваших запросов, которые вы упоминаете, работает, вероятно, не работает, как вы ожидаете. 'SELECT DISTINCT count (*)' будет считать все строки, а не только уникальные, а затем возвращать 1 строку в результате. Затем 'DISTINCT' будет фильтровать это только до уникальных строк, но поскольку возвращается только одна строка (счетчик), это не помогает включить' DISTINCT'. Если вы хотите считать разные строки, вы должны поместить 'DISTINCT' в' COUNT'. – Interrobang