Подсчет строк из большого запроса MySQL (zend) - PullRequest
1 голос
/ 16 марта 2012

Я разработал в Zend и имею довольно большой запрос MySQL.Запрос работает нормально, и я получаю список, который я ожидаю.Я делаю это, используя Select-> Где .... ниже запрос.

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», которое сгенерировало первый запрос, но я сбросил столбцы и добавил счетчик.

$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', возвращенные для второго.,Кто-нибудь знает, почему он не работает для большого запроса?

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Хорошо, понял, что это был GROUP BY, который вызывал только 1 результат. Спасибо Interrobang за вашу помощь. Я уверен, что неправильное использование DISTINCT вызовет у меня головную боль в будущем.

0 голосов
/ 17 марта 2012

Попробуйте использовать 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, чтобы включить эту способность.

0 голосов
/ 16 марта 2012

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

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