Zend_Db_Selectステートメントで括弧を付けずに "HAVING"句を使用するにはどうすればよいですか?

Zendはhaving()メソッドを提供していますが、私が望むのは次のようなクエリです:

SELECT a.*, `as`.* FROM `fruit_db`.`apples` AS `a`
INNER JOIN `fruit_db`.`apple_seeds` AS `as` ON a.id = as.apple_id
WHERE (a.id = 1) AND as.seed_name HAVING 'johnny'

「HAVING(as.seed_name = 'johnny')」ではない

少し前に戻ると、テーブルがあります:

fruit_db.apples

| id  | name |
--------------
|  1  | red  |
|  2  | green|

fruit_db.apple_seeds

| apple_id | seed_name | 
------------------------
| 1        | johnny    |
| 1        | judy      |
| 2        | granny    |

結果は次のようにしたい:

| id  | name | apple_id | seed_name |
-------------------------------------
| 1   | red  |    1     | johnny    |
| 1   | red  |    1     | judy      |

上記のクエリではこの結果が得られますが、Zend_Db_Selectを使うとhavingとwhere文の各部分のまわりに括弧を入れてクエリを無効にします。そう

$zend_db_table->select()
 ->setIntegrityCheck(false)
 ->from(array("a" => "apples"), array("*"))
 ->join(array("as"=>"apple_seeds"),
     "a.id = as.apple_id",
   array("*"))
 ->where('a.id = 1')
 ->where('as.seed_name HAVING "johnny"');

次を生成する:

SELECT a.*, `as`.* FROM `fruit_db`.`apples` AS `a`
INNER JOIN `fruit_db`.`apple_seeds` AS `as` ON a.id = as.apple_id
WHERE (a.id = 1) AND (as.seed_name HAVING 'johnny')

これは無効なSQLです。要するに:

SELECT a.*, `as`.* FROM `fruit_db`.`apples` AS `a`
INNER JOIN `fruit_db`.`apple_seeds` AS `as` ON a.id = as.apple_id
WHERE (a.id = 1) AND as.seed_name HAVING 'johnny'

有効ですが、

SELECT a.*, `as`.* FROM `fruit_db`.`apples` AS `a`
INNER JOIN `fruit_db`.`apple_seeds` AS `as` ON a.id = as.apple_id
WHERE (a.id = 1) AND (as.seed_name HAVING 'johnny')

Zendが生成するSQLは無効です。私はapple_name = 1とseed_name 'johnny'がどこかの結果にあるすべての行を必要としています。私はZend_Db_Selectを介して必要なものを手に入れることができますか、生のquery()ルートを使う必要がありますか?

編集:私は少し質問を私が欲しいものに近づき、少し明確にしようと改訂しました。

3
私はZendについて何も知らないが、HAVINGはWHERE句の一部ではないことを知っている。だから、間違った方法でクエリを作成していると思います。 HAVINGはGROUP BYの一部です... ZendのGROUP BYドキュメントを見ると、あなたの答えが見つかります。私はHAVINGがGROUP BYなしでも有効であるかどうかわかりませんが、多分それはMySQLでいくつかの魔法のGROUP BYを暗示しています。私はまた、HAVING 1が有効なHAVING節ではないと思いますが、もう一度...多分魔法のMySQLnessでしょう。
追加された 著者 Flimzy,
私はFlimzyに同意します。あなたはクエリーが間違っています。 Zendでは - having()メソッドを使用できますが、クエリは無効です。
追加された 著者 Peter,
あなたはおそらく正しいFlimzyです。私は、あなたが "as.seed_name HAVING 'johnny'"を使って私の最初のクエリを保証することができるので、私がそれを望んでいる間、長い間欲しいと思っているので、私はいくつかの魔法のGROUP BYや何かを暗示しているように、それの周りに括弧がない、私はちょうどそのようにそれを生産するZendを得ることができません。 Zend's - >()は残念ながら、私が探している結果セットを提供していません。私は、MySQLのドキュメントを掘り下げて、今のところ単純なold - > query()を使っています。ありがとう!
追加された 著者 thecheese,

1 答え

変化する

->where('as.apple_id HAVING 1');

->having('as.apple_id = 1');

http://framework.zend.com/manual/en/zend.db .select.html

1
追加された
- > where( 'a.id = 1')のままにして、代わりに - > where( 'as.seed_name HAVING "johnny"')これはproduct sql where as.seed_name = 'johnny'を持つa.id = 1である必要があります。
追加された 著者 nisav,
これを修正した質問/クエリに適用すると、SELECT a。*、 as 。* FROM fruit_dbapples > a apple_seeds のようにIN fruit_db HAZING as.seed_name = 'johnny'問題は、seed_nameが "johnny"と等しい行だけを返すことです。私はapple_idが1のすべての行を取得しようとしていますが、それらの行のいずれかに "johnny"のseed_nameがある場合にのみ、
追加された 著者 thecheese,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com