1

私は zend で開発しており、かなり大きな mysql クエリを持っています。クエリは正常に機能し、期待するリストを取得します。Select->Where.... を使用してこれを行っています。以下はクエリです。

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);

この方法は、他のすべてのクエリで問題なく機能しますが、これは私が問題を抱えているクエリのみです。そこにある「ケース」を実行する何かがあると思われますが、最初のクエリで正しい行を取得しているため、奇妙です。何か案は。ありがとう。

参考までに、以下は私が正常に動作している 2 つのクエリです。

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 行が返され、2 番目のクエリでは 'int 4' が返されます。大きなクエリで機能しない理由を知っている人はいますか?

4

3 に答える 3

0

移動しますDISTINCT

SELECT COUNT(DISTINCT `po`.*) AS `rowCount` ...
于 2012-03-15T21:57:40.363 に答える
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 を拡張してこの機能を組み込んだ人が見つかります。

于 2012-03-17T17:12:11.903 に答える
0

わかりました。結果が 1 つしか返されなかったのは GROUP BY でした。Interrobang さん、助けてくれてありがとう。DISTINCT を間違って使用すると、将来頭痛の種になると確信しています。

于 2012-03-16T11:29:20.007 に答える