Как использовать предложение «HAVING» в операторе Zend_Db_Select без скобок? - PullRequest
3 голосов
/ 28 октября 2011

Я знаю, что 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'

, а не "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 ставит круглые скобки вокруг каждой части операторов where и 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.Мне не нужна только одна строка, в которой было указано имя_видения «Джонни», я хочу, чтобы ВСЕ строки были где идентификатор яблока = 1, а «имя_семена» «Джонни» где-то в этих результатах.Могу ли я получить то, что мне нужно, через Zend_Db_Select или мне нужно пройти по маршруту raw query ()?

Редактировать: я немного пересмотрел вопрос, чтобы быть ближе к тому, что я хочу, и попытался уточнить егонемного.

1 Ответ

1 голос
/ 28 октября 2011

изменение

-> где ('as.apple_id HAVING 1');

до

-> Имеющий ('as.apple_id = 1');

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

...