2011-10-28 9 views
3

私は、Zendが持つ()メソッドを提供して知っているが、私が欲しいのは、クエリのようなものです:ビットをバックトラッキングかっこなしでZend_Db_Selectステートメントで "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 = 'ジョニー')"

、我々

fruit_db.apples

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

fruit_db.apple_seeds

:テーブルを持っています

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

提供上記のクエリこの結果を与えるが、使用してZend_Db_Selectは私のクエリを無効にしたとステートメントの各部分の周りに括弧を置く:

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

10は、私のような結果が欲しいです。だから、

$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"'); 

は生成:無効な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のは生産

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です。私はapple_name = 1とseed_name 'johnny'がどこかの結果にあるすべての行を必要としています。私はZend_Db_Selectを介して必要なものを手に入れることができますか、生のquery()ルートを使う必要がありますか?

編集:質問を少し修正して、私が望むものに近づき、少し明確にしようとしました。

+0

私は、Zendについては何も知らないが、私は持つことはWHERE句の一部ではないことを知っています。だから、間違った方法でクエリを作成していると思います。 HAVINGはGROUP BYの一部です... ZendのGROUP BYドキュメントを見ると、あなたの答えが見つかります。私はHAVINGがGROUP BYなしでも有効であるかどうかわかりませんが、多分それはMySQLでいくつかの魔法のGROUP BYを暗示しています。私はまた、HAVING 1が有効なHAVING節ではないと思いますが、もう一度...多分魔法のMySQLnessでしょう。 – Flimzy

+0

私はFlimzyに同意します。あなたはクエリーが間違っています。 Zendでは ' - > having()'メソッドを使うことができますが、あなたのクエリは無効です。 – Peter

+0

あなたはおそらくFlimzyです。私は、あなたが "as.seed_name HAVING 'johnny'"を使って私の最初のクエリを保証することができるので、私がそれを望んでいる間、長い間欲しいと思っているので、私はいくつかの魔法のGROUP BYまたは何か他のものを暗示しているように、それの周りに括弧がない、私はちょうどそのようにそれを生産するZendを得ることができません。 Zend's - >()は残念ながら、私が探している結果セットを提供していません。私は、MySQLのドキュメントを掘り下げて、今のところ単純なold - > query()を使っています。ありがとう! – thecheese

答えて

1

変化 - (1 'を備えたas.apple_id')>。

に - >を有する( 'as.apple_id = 1');

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

+0

修正された質問/クエリにこれを適用すると、 SELECT a。*、 'as'。* FROM' fruit_db'.apples' AS 'a' INNER JOIN 'fruit_db'.apple_seeds' AS' as.id = as.apple_id WHERE(a.id = 1)HAZING as.seed_name = 'johnny' 問題は、seed_nameが "johnny"に等しい行を1つだけ返すことです。私はapple_idが1であるすべての行を取得しようとしていますが、それらの行のいずれかに "johnny"というseed_nameがある場合にのみ – thecheese

+0

を残してから、 ' - > where( 'a.id = 1')' ( 'as.seed_name = "johnny"') 'これはプロダクトsql'になります。ここで、a.id = 1はas.seed_name = 'ジョニー' – nisav