[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
sawic - 14-12-2006 16:09
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
Witam.
Mam tak? tabel?:
user (char (20)) | wartosc (int (5)) ------------------------------------ user1 | 25 user2 | 13 user3 | 233 user4 | 24 user5 | 232
Czytam: "select user from db.table order by wartosc desc" i user1 zostaje zczytany jako trzeci w kolejno?ci.
Czy jest mo?liwo?? wykonania zapytania które w zapisie dos?ownym wygl?da?o by: [czytaj który b?dzie user1 gdybym czyta? tabel? w kolejno?ci (order by wartosc desc)] I ?eby wynikiem tego zapytania by?o 3.
Mo?e jest jaka? komenda na kszta?t SQL_CALC_ROWS aby bez kombinowania odpyta? baze w powy?szym celu ?
Pozdrawiam
=?UTF-8?B?RmlsaXAgUmVtYmlhxYJrb3dza2k=?= - 14-12-2006 16:09
sawic napisa??(a): > Witam. > > Mam takÄ? tabelÄ?: > > user (char (20)) | wartosc (int (5)) > ------------------------------------ > user1 | 25 > user2 | 13 > user3 | 233 > user4 | 24 > user5 | 232 > > Czytam: "select user from db.table order by wartosc desc" i user1 > zostaje zczytany jako trzeci w kolejno??ci. > > Czy jest mo??liwo??Ä? wykonania zapytania kt??re w zapisie dos??ownym > wyglÄ?da??o by: > [czytaj kt??ry bÄ?dzie user1 gdybym czyta?? tabelÄ? w kolejno??ci (order by > wartosc desc)]
count ?
select user, ( select count(*) from db.table t2 where t2.wartosc >= t1.wartosc ) as pozycja from db.table t1
> I ??eby wynikiem tego zapytania by??o 3. > > Mo??e jest jaka?? komenda na kszta??t SQL_CALC_ROWS aby bez kombinowania > odpytaÄ? baze w powy??szym celu ? > > Pozdrawiam
sawic - 14-12-2006 16:09
Filip Rembia??kowski napisa??(a): > count ? > > select user, ( select count(*) from db.table t2 where t2.wartosc >= t1.wartosc ) > as pozycja from db.table t1
Dzia??a. Sam jako?? nie mog??em na to wpa??Ä?.
Pozdrawiam
Artur - 14-12-2006 16:09
=?iso-8859-2?q?Re:_Wy=B6wietlenie_kolejnej_pozycji,_jak=B1_mi a=B3by_dany_rekord,_gdybym_czyta=B3_wg_ko?=
> > select user, ( select count(*) from db.table t2 where t2.wartosc >= t1.wartosc ) > > as pozycja from db.table t1 > > Dzia?a. > Sam jako? nie mog?em na to wpa??.
Zapytanie z count(*) niestety mo?e nie dzia?a? wydajnie, poniewa? dla ka?dego rekordu wynikowego niestety trzeba b?dzie wykona? zliczanie. Koszt takiego zapytania b?dzie przyrasta? wyk?adniczo, wraz ze wzrostem liczby rekordów. Za??czy?em inn? wersj? zapytania, które jest du?o wydajniejsze.
Wersja 1 -- du?y koszt ------------------ select uzytk, (select count(*) from tab1 t2 where t2.wartosc >= t1.wartosc) as pozycja from tab1 t1 ;
Wersja 2 -- ma?y koszt ------------------ select uzytk, row_number() over( order by wartosc desc) as pozycja from tab1;
-- Artur Wro?ski
[PS. testy wykona?em na DB2 dla 100 ty?. rekordów]
sawic - 14-12-2006 16:09
Artur napisa?(a): > Wersja 2 -- ma?y koszt > ------------------ > select uzytk, row_number() over( order by wartosc desc) as pozycja from > tab1;
Nie mog?em tego zmusi? do dzia?ania. Nie mog? te? znale?? dokumentacji dla tego zapytania dla MySQL. Czy row_number() over() nie jest aby tylko dla Oracle ?
Pozdrawiam
Artur - 14-12-2006 16:10
=?iso-8859-2?q?Re:_Wy=B6wietlenie_kolejnej_pozycji,_jak=B1_mi a=B3by_dany_rekord,_gdybym_czyta=B3_wg?=
> > Wersja 2 -- ma?y koszt > > ------------------ > > select uzytk, row_number() over( order by wartosc desc) as pozycja from > > tab1; > > Nie mog?em tego zmusi? do dzia?ania. > Nie mog? te? znale?? dokumentacji dla tego zapytania dla MySQL. > Czy row_number() over() nie jest aby tylko dla Oracle ? > > Pozdrawiam
Widocznie MySQL tej konstrukcji nie wspiera :-(
row_number() over() jest standardem w DB2, Oracle i MS SQL.
Mo?esz zastanowi? si? nad wykorzystaniem bezp?atnych edycji tych baz. Wszystkie mog? by? stosowane komercyjnie. DB2 nie ma ogranicze? co do rozmiaru bazy, pozosta?e ograniczaj? do max. 4 GB danych.
Krótkie porównanie bezp?atnych baz mo?esz znale?? np. pod adresem:
http://www.manifold.net/doc/7x/datab...tallations.htm
Pozdrawiam, -- Artur Wro?ski
sawic - 14-12-2006 16:10
Artur napisa?(a): > Mo?esz zastanowi? si? nad wykorzystaniem bezp?atnych edycji tych > baz. Wszystkie mog? by? stosowane komercyjnie. DB2 nie ma ogranicze? > co do rozmiaru bazy, pozosta?e ograniczaj? do max. 4 GB danych. > > Krótkie porównanie bezp?atnych baz mo?esz znale?? np. pod > adresem: > > http://www.manifold.net/doc/7x/datab...tallations.htm
Wszystko ?adnie i pi?knie, ale mam komercyjny hosting w nazwa.pl Tam jedynie MySQL lub PostregeSQL. To ju? wol? MySQL.
Posdrawiam
Artur - 14-12-2006 16:10
=?iso-8859-2?q?Re:_Wy=B6wietlenie_kolejnej_pozycji,_jak=B1_mi a=B3by_dany_rekord,_gdybym_czyta=B3_wg?=
> Wszystko ?adnie i pi?knie, ale mam komercyjny hosting w nazwa.pl > Tam jedynie MySQL lub PostregeSQL. > To ju? wol? MySQL.
Rozumiem, ?e nazwa.pl daje Ci do wyboru tylko MySQL lub PostgreSQL i to jest rzeczywi?cie ograniczenie.
To ?e jest komercyjny, nie ma znaczenia.
Powodzenia, -- Artur Wro?ski
Maciek Dobrzanski - 14-12-2006 16:10
"sawic" <sawicc@wytnij.to.gmail.com> wrote in message news:ela4ra$3p8$1@news.onet.pl...
> Czy jest mo?liwo?? wykonania zapytania które w zapisie dos?ownym wygl?da?o > by: > [czytaj który b?dzie user1 gdybym czyta? tabel? w kolejno?ci (order by > wartosc desc)] > I ?eby wynikiem tego zapytania by?o 3.
Wyci?gni?cie ca?ej listy najwydajniej b?dzie wykona? poprostu sortuj?c warto?ci, z uwzgl?dnieniem konieczno?ci za?o?enia indeksu na par? (wartosc, user). Czyli:
SET @pozycja := 0; SELECT t.user, @pozycja := @pozycja + 1 AS pozycja FROM tabela t ORDER BY t.wartosc DESC;
Natomiast w przypadku wyci?gania informacji o pozycji pojedynczego(!) u?ytkownika to oczywi?cie podany ju? wcze?niej przyk?ad wydaje si? by? dobry:
SELECT t1.user, (SELECT COUNT(1) FROM tabela t2 WHERE t2.wartosc >= t1.wartosc) AS pozycja FROM tabela t1 WHERE t1.user = 'user1';
Maciek
Maciek
sawic - 14-12-2006 16:10
Maciek Dobrzanski napisa?(a): > Wyci?gni?cie ca?ej listy najwydajniej b?dzie wykona? poprostu sortuj?c > warto?ci, z uwzgl?dnieniem konieczno?ci za?o?enia indeksu na par? (wartosc, > user). Czyli: > > SET @pozycja := 0; > SELECT t.user, @pozycja := @pozycja + 1 AS pozycja FROM tabela t ORDER BY > t.wartosc DESC;
Jak wyci?gam wszystko to po prostu w php incrementuje sobie zmienn?.
> Natomiast w przypadku wyci?gania informacji o pozycji pojedynczego(!) > u?ytkownika to oczywi?cie podany ju? wcze?niej przyk?ad wydaje si? by? > dobry: > > SELECT t1.user, (SELECT COUNT(1) FROM tabela t2 WHERE t2.wartosc >= > t1.wartosc) AS pozycja FROM tabela t1 WHERE t1.user = 'user1';
Ok. To ju? dalej nie kombinuj?. Wa?ne, ?e dzia?a.
Dzi?ki. Pozdrawiam
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Gdzie MySQL 4.1, a gdzie 5.0?
[MS SQL] "set names" (mySQL) w MS SQL
oracle -> oracle lub oracle -> mysql replikacja - programy
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
[MySQL] Zwrot tego, co pasuje i nie pasuje :-/
[pgsql] Dostosowanie sk³adni MySQL 5.0 -> PGSQL 8.1
[mysql] galeria zdjec - numerowanie zdjec
[MySQL] Zapytanie z pliku , wynik do pliku
[mysql] CONCAT agreguj±cy, ale nie GROUP_CONCAT()
mysql data 0000-00-00 na koniec
zanotowane.pldoc.pisz.plpdf.pisz.plczterowers.keep.pl
Cytat
Decede mihi sole - nie zas³aniaj mi s³onca. Gdy kogo¶ kochasz, jeste¶ jak stworzyciel ¶wiata - na cokolwiek spojrzysz, nabiera to kszta³tu, wype³nia siê barw±, ¶wiat³em. Powietrze przytula siê do ciebie, choæby by³ mróz, a ty masz w sobie tyle rado¶ci, ¿e musisz j± rozdawaæ woko³o, bo siê w tobie nie mie¶ci Hoc fac - tak czyñ. A tergo - od ty³u; z ty³u. I czarne w³osy posiwiej±. Safona |
|