Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZF][Zend db_select]Ranking rekordów
Janusz1200
post 29.03.2012, 14:39:43
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 6
Dołączył: 19.12.2010
Skąd: Krzyżanowice

Ostrzeżenie: (0%)
-----


Witam, wie ktoś może, jak napisać coś takiego w Zendzie:

SELECT @pos:=@pos+1, id, table_pkt FROM `user`, (select @pos:=0) p WHERE league_id=2 order by points desc

(chodzi o dodatkową kolumnę, która numeruje rekordy)

Próbowałem z joinCross:
$select->joinCross('(select @pos:=0) p');

ale coś nie idzie....


Pozdrawiam

Janusz
Go to the top of the page
+Quote Post
viking
post 29.03.2012, 15:08:05
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Opakować w Zend_Db_Expr. Przykład http://php.r3dcode.com/files/Magento/1.6/1...lper/Mysql4.php


--------------------
Go to the top of the page
+Quote Post
Janusz1200
post 29.03.2012, 16:56:00
Post #3





Grupa: Zarejestrowani
Postów: 110
Pomógł: 6
Dołączył: 19.12.2010
Skąd: Krzyżanowice

Ostrzeżenie: (0%)
-----


W przykładzie, który podałeś, robią 2 query (inicjowanie zmiennej i użycie zmiennej w selekcie)

$adapter->query("SET @pos = 0 .... ");
95
96 $adapter->query($sql);
97

nie wiem, czy to jest bezpieczne w sensie transakcyjności.
Ja zrobiłem w jednym select, tyle, że to jest nie tak eleganckie, jakbym chciał.

$sql= "SELECT @pos:=@pos+1 position, id
FROM section_user, (select @pos:=0) p
WHERE league_id=? order by table_pkt desc,
(table_pktwin - table_pktlost) DESC, table_w DESC,
table_d DESC,table_l

return $this->getAdapter()->fetchAll($sql, $leagueId);

Ten post edytował Janusz1200 29.03.2012, 16:57:12
Go to the top of the page
+Quote Post
Pilsener
post 30.03.2012, 08:58:47
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


A jak byś chciał?
  1. $select = $this->select();
  2. $select->from($this->_name,array($this->_name.'.*','test'=>new Zend_Db_Expr('now()')));


Zamiast "now()" wstaw to, co potrzebujesz, czyli te zmienne.
Go to the top of the page
+Quote Post
Janusz1200
post 30.03.2012, 11:23:18
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 6
Dołączył: 19.12.2010
Skąd: Krzyżanowice

Ostrzeżenie: (0%)
-----


Cytat(Pilsener @ 30.03.2012, 09:58:47 ) *
A jak byś chciał?
  1. $select = $this->select();
  2. $select->from($this->_name,array($this->_name.'.*','test'=>new Zend_Db_Expr('now()')));


Zamiast "now()" wstaw to, co potrzebujesz, czyli te zmienne.

Dzięki. Faktycznie w tym, co napisałeś, jest dodawanie nowej kolumny ( @pos:=@pos+1 ), jak w podanym przez Vikinga przykładzie. Chodzi teraz o zainicjowanie zmiennej @pos zerem. Można to zrobić w dwóch zapytaniach,
jak w podanym przez Vikinga przykładzie, ale to budzi moje obawy, można próbować w jednym zapytaniu.
I właśnie problem leży w tym, że żeby w jednym zapytaniu ustawić wartość początkową zmiennej @pos
na 0, trzeba dać from (jak dodatkowa tabela), w sql to wygląda tak:

FROM section_user, (select @pos:=0) p

natomiast w Zend, żeby to grało, to trzeba tę tabelę dostawić jakoś, może tak:

$select->joinCross('(select @pos:=0) p');

ale to nie idzie. Faktycznie, może w tym joinCross trzeba by użyć Zend_Db_Expr,
może spróbuję.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 05:28