2011-10-28 29 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

| 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對象放在括號中有和,語句該無效我查詢的每一部分的周圍。所以

$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。我不希望只有一行有seen_name'johnny',我希望所有行的apple id = 1 AND seed_name'johnny'在這些結果中的某處。我可以通過Zend_Db_Select獲取我需要的東西,還是需要轉到原始查詢()路由?

編輯:我已經修改了這個問題一點點,以接近我想要的,並試圖澄清一點。

+0

我不知道Zend的東西,但我確實知道,HAVING不是WHERE子句的一部分。所以我很確定你使用錯誤的方法來建立你的查詢。 HAVING是GROUP BY的一部分......所以,如果你看看Zend的GROUP BY文檔,你會發現你的答案。我不知道沒有GROUP BY的情況下HAVING是否是有效的,但也許它暗示了MySQL中的一些神奇的GROUP BY。我也不認爲'HAVING 1'是一個有效的HAVING子句,但是也可能是......也許是神奇的MySQLness。 – Flimzy

+0

我同意Flimzy。你的查詢是錯誤的。你可以在Zend中使用' - > having()'方法,但你的查詢仍然無效。 – Peter

+0

你可能是對的。我同意我可能濫用HAVING的方式可能暗含着一些神奇的GROUP BY或別的東西,因爲我可以向你保證我的第一個查詢使用「as.seed_name HAVING'johnny'」,只要我希望它能夠工作,周圍沒有括號,我只是無法讓Zend以這種方式製作它。 Zend's - > having()不幸的是沒有給出我正在尋找的結果集。我想我會繼續深入挖掘MySQL文檔,並且現在只使用普通的old - > query()。謝謝! – thecheese

回答

1

變化

- >其中( 'as.apple_id具有1');

- >具有( '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' ON a.id = as.apple_id WHERE(a.id = 1)HAVING as.seed_name ='johnny' 問題是,它只返回seed_name等於「johnny」的一行。我正在尋找apple_id爲1的所有行,但只有當這些行中的任何一行的seed_name爲「johnny」 – thecheese

+0

,然後將' - > where('a.id = 1')'保持原樣並改爲更改' - > where('as.seed_name HAVING'johnny'')'to' - > having('as.seed_name =「johnny」'')這應該是產品sql'其中a.id = 1具有as.seed_name = 「johnny'' – nisav