ďťż
 
[MySQL] Skomplikowany count(), jak to =?ISO-8859-2?Q?wykona=E6_?==?ISO-8859-2?Q?=3F?= ďťż
 
[MySQL] Skomplikowany count(), jak to =?ISO-8859-2?Q?wykona=E6_?==?ISO-8859-2?Q?=3F?=
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[MySQL] Skomplikowany count(), jak to =?ISO-8859-2?Q?wykona=E6_?==?ISO-8859-2?Q?=3F?=



sawic - 29-06-2006 00:43
[MySQL] Skomplikowany count(), jak to =?ISO-8859-2?Q?wykona=E6_?==?ISO-8859-2?Q?=3F?=
  Witam.
Mam tabelę:
komorka1 - int, mozliwe wartosci 1,2 lub 3
komorka2 - text - mozliwe wszystko
komorka3 - datetime

Chę zliczyć ilość wystąpień 1,2 lub 3 w komórce1 grupując po komorka2,
sortując po ilości wystąpień 1 w komorka1, ale dodatkowo tylko w 10
najnowszych rekordach.

Skomlikowany trochę ten mój opis, ale już wszystko tłumaczę.
Takie zapytanie ładnie działa:

select count(case when komorka1 = '1' then 1 else null end) as
komorka1_1, count(case when komorka1 = '2' then 1 else null end) as
komorka1_2, count(case when komorka1 = '3' then 1 else null end) as
komorka1_3, komorka2 from db.table group by komorka2

Ale dostaje zliczone wszystkie wystepujace rekordy, nie wiem teraz jak
ograniczyc zliczanie do 10 najnowszych rekordow dla unikalnych wystapien
komorka2.

Jest na to sposob, ale skomplikowany:

czytam distinct komorka2;
dla kazdego komorka2 czytam rekordy w kolejnosci komorka3 malejaco limit
10 i wstawiam to do tymczasowej tabeli;
teraz wykonuje wczesniej napisane odpytanie bazy, czyli zliczam ilosc
wystapien 1,2 lub 3 dla komorka1 i wtedy wyswietlam to sobie w
kolejnosci komorka1_1.

Czy da się to zrobić prościej ?
Może w jednym odpytaniu ?

Pozdrawiam





Artur Gancarz - 06-07-2006 00:20
=?ISO-8859-2?Q?Re=3A_=5BMySQL=5D_Skomplikowany_count=28=29?== ?ISO-8859-2?Q?=2C_jak_to_wykona=E6_=3F?=
  Użytkownik sawic napisał:
> Witam.
> Mam tabelę:
> komorka1 - int, mozliwe wartosci 1,2 lub 3
> komorka2 - text - mozliwe wszystko
> komorka3 - datetime
>
> Chę zliczyć ilość wystąpień 1,2 lub 3 w komórce1 grupując po komorka2,
> sortując po ilości wystąpień 1 w komorka1, ale dodatkowo tylko w 10
> najnowszych rekordach.
>
> Skomlikowany trochę ten mój opis, ale już wszystko tłumaczę.
> Takie zapytanie ładnie działa:
>
> select count(case when komorka1 = '1' then 1 else null end) as
> komorka1_1, count(case when komorka1 = '2' then 1 else null end) as
> komorka1_2, count(case when komorka1 = '3' then 1 else null end) as
> komorka1_3, komorka2 from db.table group by komorka2
>
> Ale dostaje zliczone wszystkie wystepujace rekordy, nie wiem teraz jak
> ograniczyc zliczanie do 10 najnowszych rekordow dla unikalnych wystapien
> komorka2.
>
> Jest na to sposob, ale skomplikowany:
>
> czytam distinct komorka2;
> dla kazdego komorka2 czytam rekordy w kolejnosci komorka3 malejaco limit
> 10 i wstawiam to do tymczasowej tabeli;
> teraz wykonuje wczesniej napisane odpytanie bazy, czyli zliczam ilosc
> wystapien 1,2 lub 3 dla komorka1 i wtedy wyswietlam to sobie w
> kolejnosci komorka1_1.
>
> Czy da się to zrobić prościej ?
> Może w jednym odpytaniu ?
>
> Pozdrawiam

Witaj,
mam nadzieję że będę pomocny, a mianowicie:
Krok 1) podzapytanie, które w wyniku pozostawi ci 10 najnowszych
rekordów (po korórka3), tj:

select * from tabela where komorka2='CO TAM SOBIE WYBRALES' order by
komorka3 desc;

DESC oznacza odwroconą kolejność, limit oznacza "podaj tylko 10
pierwszych" (co oznacza, że dostaniesz 10 najnowszych). Tekst "CO TAM
SOBIE WYBRALES' jest warunkiem, ktory zalozyłeś, że dla pewnych
wybranych wartości "komórka2" ma to być robione.

Krok 2)
użycie podzapytania do pytanie właściwego

select ALIAS.komorka1,ALIAS.komorka2,count(*) from (TUTAJ TO
PODZAPYTANIE) as ALIAS group by ALIAS.komorka1;

A teraz nieco tłumaczenia:
ALIAS jest konieczny aby nazwać "pseudotabelę" która jest wynikiem
pozdapytania. Ma ona pola takie same jak twoja orybinalna "tabela", ale
koniecznie trzeba z przodu dopisywać jej nazwę z kropeczką "ALIAS."

Skoro już wybrałeś podzapytaniem "specyficzne" wartości z "komórka2" to
nie trzeba grupować po tym (bo są wszystkie takie same) ale grupuje się
po "komórka1", tylko ta z "pseudotabeli" czyli z "ALIAS." z przodu.

Po select jest komórka1 i komórka2, abyś miał wyświetlone, co zgrupował,
a count(*) policzył ci ilość wystąpień.

Jest tylko jedno ALE. Potrzebujesz MySQL 5.0, bo wcześniejsze nie
obsługują podzapytań (niestety). Zdaje się, że MySQL 4.1 już obsługiwał,
ale nie jestem pewien.

Mam nadzieję, że dużo pomogłem
Artur




Przemyslaw Popielarski - 06-07-2006 00:21
=?iso-8859-2?Q?Re:_=5BMySQL=5D_Skomplikowany_count=28=29=2C_j ak_to_wyko?==?iso-8859-2?Q?na=E6_=3F?=
  Artur Gancarz wrote:
> Jest tylko jedno ALE. Potrzebujesz MySQL 5.0, bo wcześniejsze nie
> obsługują podzapytań (niestety). Zdaje się, że MySQL 4.1 już
> obsługiwał, ale nie jestem pewien.

Ale ja jestem. Obslugiwal.

--
../ premax
../ premax@hot.pl
../ koniec i bomba, a kto czytal ten traba. w.g.




sawic - 21-07-2006 01:19
=?ISO-8859-2?Q?Re=3A_=5BMySQL=5D_Skomplikowany_count=28=29?== ?ISO-8859-2?Q?=2C_jak_to_wykona=E6_=3F?=
  Artur Gancarz napisał(a):
> mam nadzieję że będę pomocny, a mianowicie:
> Krok 1) podzapytanie, które w wyniku pozostawi ci 10 najnowszych
> rekordów (po korórka3), tj:
>
> select * from tabela where komorka2='CO TAM SOBIE WYBRALES' order by
> komorka3 desc;

Witam.
Przepraszam, że po takim czasie odpowiadam, ale wcześniej nie mogłem.
Wielkie dzięki za wyczerpujący opis, ale niestety nie było to dla mnie
pomocne.
Co do tego powyższego zapytania to muszę zliczyć trzy unikatowe
wystąpienia w komórka1 dla około dwustu różnych wartości komórka2 przy
założeniu tylko 10-ciu najnowszych wystąpień komórka1 dla każdego
komórka2, czyli sortując w odwrotnej kolejności komórka3.

W jednym zapytaniu to się chyba nie da niestety.
Zrobiłem to po kolei jak wcześniej opisałem z tymczasową tablicą.
Dostaje podliczone 10 ostatnich wystąpień komórka1 dla każdego komórka2.
Problem jest taki, że dokonuje zliczenia dla każdego komórka2 czyli
około 200 razy a następnie 195 z nich kasuje, bo interesuje mnie tylko
pierwsza piątka.
No coż.

Pozdrawiam
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    Gdzie MySQL 4.1, a gdzie 5.0? [MS SQL] "set names" (mySQL) w MS SQL oracle -> oracle lub oracle -> mysql replikacja - programy [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 [MySQL] Problem z zapisem danych w bazie danych
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ponland.htw.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com