Zend Framework zagnieżdzone zapytanie

0

Witam, czy ktoś wie, jak zrobić zagnieżdżone zapytanie takie jak "SELECT * FROM (SELECT * FROM table LIMIT 0,12) table ORDER BY Rand()" , używając do tego Zend_Db_Table ?

0

Próbowałem coś zrobić podobnego jak tutaj: http://zend-framework-community.634137.n4.nabble.com/Support-Zend-Db-Select-sub-selects-td674928.html ,ale wywala mi błędy.
Mój kod:

$subselect = $this->select()
                        ->from(array('table'))
                        ->limit(0,12);
            
 $select = $this->select()
                     ->from( 
                                array('table'),
                                array('table', new Zend_Db_Expr($subselect))
                              )                            
                    ->order(new Zend_Db_Expr('RAND()')); 

$db = $this->fetchAll($select);

Wyskakuje błąd :

Message: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT `table`.* FROM `table` LIMIT 2147483647 OFFSET 12 FROM `table` ORDER BY R' at line 1 

Coś mam nie teges w składni, ale nie mogę dojść co. Proszę o pomoc. Z góry bardzo dziękuję.

1
$subselect = $this->select()->from('table')->limit(12, 0);
$select = $this->select()->from(new Zend_Db_Expr(" (".$subselect.") ") )->order(new Zend_Db_Expr('RAND()'));

Zend_db_select posiada metodę __toString() która wyświetli wygenerowane zapytanie sql -> zakomentuj $db = $this->fetchAll($select); i wyświetl w widoku zapytanie to będziesz wiedział co się dzieje

0

Użyłem tej funkcji, doprowadziłem zapytanie do poprawnego zapytanie, ale mam jeszcze jeden problem. Nie mogę pozbyć się kropki w zapytaniu. Wie ktoś może jak to rozwiązać?

SELECT `table`.`table1` FROM (SELECT `table`.* FROM `table` LIMIT 2 OFFSET 12)<nieszczęśnakropka>.</nieszczęśnakropka>`table` ORDER BY RAND() 

Kod wygląda tak:

$subselect = $this->select()
                        ->from('table')
                        ->limit(2,12);
$select = $this->select()
                    ->from(            
                               'table',array('table1'),$subselect  
                             )
                    ->order(new Zend_Db_Expr('RAND()')); 

1
$subselect = $this->select()->from('table')->limit(2,12);
$select = $this->select()->from($subselect, array('table1'))->order(new Zend_Db_Expr('RAND()')); 

efekt:

SELECT `t`.`table1` FROM (SELECT `table`.* FROM `table` LIMIT 2 OFFSET 12) AS `t` ORDER BY RAND()

pierwszym parametrem metody from jest nazwa tabeli z której pobierasz dane -> można tam wstawić inne zapytanie

0

Problem jest taki, że zawsze kiedy subselect jest w pierwszej kolejności, przed tablicą: from($subselect, array('table1'))
to wyskakuje błąd Select query cannot join with another table in ...\Zend\ZendServer\data\libraries\Zend_Framework_1\1.12.3\library\Zend\Db\Select.php on line 1350

1

spróbuj dodać:

 $select->setIntegrityCheck(false); 
0

Bardzo Ci dziękuję za pomoc :) Wszystko działa, jak powinno. Powinienem Ci postawić piwo ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1