[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.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] 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.pldoc.pisz.plpdf.pisz.plponland.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 |
|