2013-09-25 2 views
2

Я пытаюсь запустить специальный запрос SQL в ZF 2.Zend Framework 2 - SQL подзапрос

SELECT listingId, COUNT(*) as num 
FROM 
(SELECT DISTINCT listingId, locationId 
FROM l_f_locations 
WHERE locationId IN (7, 9, 10)) AS foo 
GROUP by listingId, HAVING num = 3 

Я попытался создать подзапрос первых, как это полный запрос MySQL, но затем не интегрировать его в основной запрос вообще. Я не могу выровнять подзапрос, например. «AS foo», поскольку это требование для полной работы SQL-squery.

Любые идеи?

+0

Здесь вы можете найти свой ответ. http://tarunlinux.blogspot.in/2013/11/zf2-zenddbsqlexpression-usage.html –

ответ

4

Прежде всего, вы можете сделать это без подзапроса:

SELECT listingId, COUNT(DISTINCT locationId) AS num 
FROM l_f_locations 
WHERE listingId IN(7,9,10) 
GROUP BY listingId 
HAVING num = 3; 

Для дальнейшего использования, однако, вы могли бы сделать запрос, который вы упоминаете, используя пару объектов Zend_Db_Select, один для суб- запрос и другой для основного:

$subQuery = $dbAdapter->select() 
    ->from('l_f_locations', array('listingId', 'locationId')) 
    ->where('locationId IN(7,9,10)') 
    ->group('listingId') 
    ->group('locationId'); 

$select = $dbAdapter->select() 
    ->from($subQuery, array('*', 'num' => 'COUNT(*)')) 
    ->group('listingId') 
    ->having('num = 3'); 

$result = $select->query()->fetchAll(); 
+0

Пример Zend для ZF1, хотя вопрос ясно говорит о ZF2. Я просто задал аналогичный вопрос о ZF2: http://stackoverflow.com/questions/25606544/zend-db-select-from-subquery –

+0

$ select = $ dbAdapter-> select() -> from (array ('t ', $ subQuery)) -> столбцы (массив (' * ',' num '=>' COUNT (*) ')) -join (' t2 ',' t2.id = t1.id ' -> group ('listingId') -> having ('num = 3'); – mpoletto

+0

Я не тестировал ваш код, но присвоение имени $ subQuery было для меня работой с использованием join, например: $ select = $ dbAdapter- > select() -> from (array ('t', $ subQuery)) -> столбцы (массив ('*', 'num' => 'COUNT (*)')) -join ('t2' , 't2.id = t1.id' -> group ('listingId') -> имеющий ('num = 3'); – mpoletto