2012-03-15 2 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); 

Этот метод отлично работает для всех мои другие вопросы только с этим, с которыми я столкнулся. Я подозреваю, что у него есть кое-что, чтобы сделать «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» возвращается для второго. Кто-нибудь знает, почему он не работает для большого запроса?

ответ

0

Переместить DISTINCT.

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

Спасибо, но это не сработало. Просто чтобы подтвердить, что приведенный ниже код работает по назначению. SELECT DISTINCT count (*) AS 'rowCount' FROM' post' AS 'po' даже с отличием, где он находится, это другой запрос, который я опубликовал, с которым я столкнулся. Я даже попытался избавиться от различий все вместе, но не удача все еще вернулась 1. Любые другие идеи? Спасибо – viciouskinid

+0

Второй из ваших запросов, которые вы упоминаете, работает, вероятно, не работает, как вы ожидаете. 'SELECT DISTINCT count (*)' будет считать все строки, а не только уникальные, а затем возвращать 1 строку в результате. Затем 'DISTINCT' будет фильтровать это только до уникальных строк, но поскольку возвращается только одна строка (счетчик), это не помогает включить' DISTINCT'. Если вы хотите считать разные строки, вы должны поместить 'DISTINCT' в' COUNT'. – Interrobang

0

ОК выяснил, что это была группа, которая вызывала возврат только одного результата. Спасибо 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, чтобы включить эту возможность.

Смежные вопросы