Zend Framework zagnieżdzone zapytanie

Zend Framework zagnieżdzone zapytanie
D2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:29
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 ?

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Rzeszów
0

D2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:29
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:

Kopiuj
$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 :

Kopiuj
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ę.

edytowany 2x, ostatnio: dfray26
MP
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:3
1
Kopiuj
$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

D2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:29
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ć?

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

Kod wygląda tak:

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

edytowany 1x, ostatnio: dfray26
MP
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:3
1
Kopiuj
$subselect = $this->select()->from('table')->limit(2,12);
$select = $this->select()->from($subselect, array('table1'))->order(new Zend_Db_Expr('RAND()')); 

efekt:

Kopiuj
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

D2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:29
0

Problem jest taki, że zawsze kiedy subselect jest w pierwszej kolejności, przed tablicą: from($subselect, array('table1'))
to wyskakuje błąd:Warning: 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

MP
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 9 lat
  • Postów:3
1

spróbuj dodać:

Kopiuj
 $select->setIntegrityCheck(false); 
D2
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 10 lat
  • Postów:29
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.