Skocz do zawartości

[mysql] policzenie rekordów


Kaviorek

Rekomendowane odpowiedzi

tabela z polami: id | host

w niej rekordy odwiedzających, każdy ruch na stronie, czyli odsłony,

po kilku odsłonach zrzut wygląda tak:

9 | host1

8 | host2

7 | host2

6 | host1

5 | host3

4 | host3

3 | host1

2 | host3

1 | host1

problem mam taki, że nie wiem jakim zapytaniem wskazać ilość uniq,

3 różne hosty czyli zapytanie o uniq powinno wskazać 3

jedynie udało mi się wymęczyć, w stylu:

SELECT host, count(*) as suma FROM
stats
GROUP BY host
ORDER BY suma DESC

grupuje hosty, które najwięcej odsłon wykonały, w phpmyadmin pokazuje ile rekordów znaleziono i w jakim czasie,

i właśnie to 'ile rekordów' jest mi potrzebne, tj. ile różnych hostów znajduje się w tabeli.

Poratuje ktoś?

Będę wdzięczny.

Dziękuję, pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

Twoje zapytanie sumuje ile rekordów odpowiada dla host1, host2, host3 a nie zlicza ilości wejść znajdującej się w kolumnie id {choć to jest myjąco nadana nazwa!} Należy skorzystać z funkcji agregacji SUM();

kolumny ile | host

SELECT SUM( ile ) AS odwiedzin, host

FROM stats

GROUP BY host

LIMIT 0 , 30;

Wynik {na wlasnych rekordach testowych}:

odwiedzin host

16 host1

14 host2

10 host3

IMHO: Z uwagi na wydajność operacji kolumna host powinna być jako typ int i host reprezentowany liczbą a nie polem char/varchar lub też host jako pole char/varchar, ale z dodaniem trzeciej kolumny indexowanej typ int gdzie nazwa hosta była by reprezentowana cyfrą i w zapytaniach do niej byś się odowoływał.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Musieliśmy się chyba nie zrozumieć / źle wyjaśniłem.

Chciałbym po zapytaniu otrzymać jedną zmienną, która będzie równa ilości unikalnych hostów w całej tabeli.

Czyli wartość: Moc dla indeksu typu INDEX dla kolumny: host.

W tym przykładzie który podałem są 3 unikalne hosty, czyli chciałbym mieć tą właśnie 3 ($ile_uniq = 3;) w postaci zmiennej.

Zapytanie (pewnie to zmyliło) które podałem właśnie sumuje ile rekordów odpowiada poszczególnym hostom, i podaje mi te hosty. Gdybym teraz zliczył sobie ile razy wykonała się pętla w tym zapytaniu to bym właśnie otrzymał to co chcę, tj. ile jest unikalnych hostów w tabeli - ale oczywiście nie tak to się powinno liczyć.

Wynik zapytania powinien być podobny do np. policzenia rekordów w tabeli: SELECT count(*) FROM tabela, tj. jedna wartość.

PS. Faktycznie mam host'a jako VARCHAR z racji uproszczenia sobie pracy, ale jak widać marne to uproszczenie sporo i tak nie mogę zapytania wymyślić. Co prawda to zliczenie będzie wykonywane tylko przeze mnie od czasu do czasu, ale przy większej ilości rekordów to pewnie tak gładko nie policzy.

A właśnie chcę zmniejszyć jak najbardziej obciążenie związane z dodawaniem rekordów do tych statystyk. Danych zbieram niewiele i chcę je w jednej tabeli pomieścić, tak aby przy odsłonie był tylko jeden INSERT. Mniej wagi przykładając do późniejszego przeglądania danych z racji tego, że tylko ja to będę robił, i co dokładniejsze analizy to off-line. Ale racja, będę musiał te hosty poprawić, przeszukanie tabeli za pomocą where host = 'asdf.sdasd.tpsa.pl' nie jest najlepszym rozwiązaniem.

Odnośnik do komentarza
Udostępnij na innych stronach

W tym przykładzie który podałem są 3 unikalne hosty, czyli chciałbym mieć tą właśnie 3 ($ile_uniq = 3;) w postaci zmiennej.
Jakoś samego zapytania nie widzę, ale zapytanie + mysql_num_rows():

$zapytanie = mysql_query("SELECT COUNT(*) AS rekordy FROM stats GROUP BY host");
echo 'Ile UNIK:'. mysql_num_rows($zapytanie);

Ewentualnie jeśli kolumna host będzie indexowana zapytanie:

SHOW INDEX FROM stat;

i pobieranie danych z kolumny Cardinality

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

SELECT count(*) FROM (  SELECT host FROM  stats GROUP BY host )

MySQL zwrócił komunikat:

#1248 - Every derived table must have its own alias

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

SELECT count(*) FROM (  SELECT host FROM  stats GROUP BY host ) JAKIS_ALIAS_O_KTORYM_ZAWSZE_ZAPOMINAM;

select count(DISTINCT host) FROM  stats

I niech koś mi powie ze człowiek nie uczy się całe zycie :)

Odnośnik do komentarza
Udostępnij na innych stronach

I niech koś mi powie ze człowiek nie uczy się całe zycie ;)
Dokładnie :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności