[PHP] Zliczanie wystąpień z bazy MySQL


(dj1sklero) #1

Witam!
Mój problem polega na tym że muszę przetworzyć naprawdę spora ilość rekordów z tabeli, szukam takiego rozwiązania by załatwić sprawę jednym zapytaniem inaczej bd musiał zrobić ich 29.

Moje zapytanie wygląda teraz tak “SELECT stacja COUNT(stacja) FROM tabela WHERE wpis > ‘$start’ AND wpis < ‘$stop’ GROUP BY stacja”

Ogólnie rzecz biorąc sortuje te wyniki i chce by wyświetliło mi ilość wystąpień danego stringa, tylko nie wiem teraz jak przetworzyć to zapytanie by wyświetliło mi dane. Być może też źle układam zapytanie do bazy.


(kokoxD) #2

Po stacja powinien być przecinek. A tak po za tym nie wiem co chcesz tym zapytaniem uzyskać. Postaraj się napisać to jaśniej.’

Chodzi ci o zapytanie które znajdzie coś w określonym czasie?


(dj1sklero) #3

Mam 29 maszyn i dla nich chce zliczyć wystąpienia rekordów po kolumnie stacja w danym okresie czasu i to jakoś fajnie wyprintowac w tabelce na przykład. Bo do tej pory robiłem to przez własną funkcje i powtarzałem tyle razy ile mam maszyn ale nie chce bazy obciążać bo i tak ma dość a swoją drogą czekać 20 s na załadowanie strony to tez porażka.


(kokoxD) #4

Jakiego typu jest wpis? Sprawdzałeś do testu czy działa bezpośrednio w bazie? Jak nie to sprawdź i jak będzie działało to daj kod php który odpowiada za wyświetlanie tego.

Ps. Zamiast $start wpisz coś na sztywno.


(Fizyda) #5

Trochę nie wiem co ty chcesz osiągnąć, daj przykładowe dane i przykładowy wynik jaki chcesz uzyskać.


(dj1sklero) #6

Mam w tej kolumnie rozpisane nazwy maszyn na zasadzie:
maszyna1
mszyna2
maszyna3
nie są po kolei chce je zgrupować i wyświetlić wystąpienia na zasadzie:
maszyna1 - 150
maszyna2 - 324 itd


(Fizyda) #7

SELECT DISTINCT stacja, COUNT(stacja) as amount FROM tabela WHERE twoje_warunki GROUP BY stacja;

Coś w tym stylu. W wyniku będziesz miał 2 kolumny stacja i amount gdzie amount to ilość wystąpień stacji.

  • amount w zapytaniu powinno być zapisane pomiędzy kopniętymi apostrofami, ale jest źle wyświetlane jako kod więc usunąłem

(dj1sklero) #8

Dobrze, ale widocznie jeszcze mało w PHP wiem bo teraz nie wiem jak wyświetlić te wyniki


(Fizyda) #9

Pokaż jak to robisz w obecnej formie.


(dj1sklero) #10

wcześniej wyświetlałem licznie za pomocą funkcji mysql_fetch_array teraz dostaje tylko liczbę akurat liczbę 9242, tutaj kod:

$z = mysql_query(“SELECT DISTINCT stacja, COUNT(stacja) as `amount` FROM tabela GROUP BY stacja;”);
$x = mysql_fetch_array($z);
echo $x[amount];


(Fizyda) #11

Nie masz teraz jednego wiersza a tyle ile stacji. Musisz to zrobić w pętli, przykłady masz w dokumentacji http://php.net/manual/en/function.mysql-fetch-array.php lub http://php.net/manual/en/function.mysql-fetch-assoc.php

Czyli coś w ten deseń (pisane z palca):

while ($row = mysql_fetch_assoc($result)) {
    echo $row['stacja'] + " - " + $row['amount'] 
}

(dj1sklero) #12

do tego dodałem łamanie linii i wyświetla mi ciągli liczb bez nazw stacji.

Przykład:
9242
7200
8871
24811
142450


(Fizyda) #13

Na pewno kolumna z nazwą stacji nazywa się stacja? Zobacz może w bazie danych co Ci zwraca zapytanie może popełniłem gdzieś błąd, albo nazwy się nie zgadzają. Ewentualnie zobacz co dostajesz do skryptu.
Nie jestem w stanie za bardzo Ci pomóc ponieważ nie wiem jak wygląda Twoja baza danych ani skrypt. Nie jestem też w stanie zdebugować za Ciebie problemu? Może dostajesz jakieś errory - nie wiem.


(dj1sklero) #14

w bazie ok, wynik zapytania w workbench:

[null] 9242
cp102  7200
cp103  8909
cp11   25021
cp12   142563

A tutaj daje pełne zapytanie z wyświetleniem:

$z = mysql_query("SELECT DISTINCT stacja, COUNT(stacja) as `amount` FROM tabela  GROUP BY stacja;");

while ($row = mysql_fetch_assoc($z)) {
echo $row['stacja'] + " - " + $row['amount'];
echo '<br />';

}


(Fizyda) #15
  1. Jak nazywają się kolumny w workbenchu?
  2. Czy w bazie są dane bez stacji? Bo w wyniku wygląda to tak jakby tak było, ponieważ w jednym wierszu zamiast nazwy stacji masz null.

Kolejne rzeczy:

  1. W php nie musisz podawać średnika na końcu zapytania, usuń go

  2. dodaj do columny stacja alias może w tedy zacznie działać

    SELECT DISTINCT stacja as stacja, COUNT(stacja) as amount

3.Gdzie zgubiłeś swojego where?


(dj1sklero) #16
  1. mam id z automatem mam wpis czyli datetime oraz stacja czyli to co przerabiamy, i inne dane jeśli chodzi o użytkownika
  2. tak zdarzają się bo jest to logowanie użytkownika i nie podaje nazwy stacji.

Zrobiłem co pisałeś ale nie przyniosło to skutku po testowałem jeszcze alias by nie był taki sam jak kolumna ale też nic to nie dało.


(Fizyda) #17

Dziwne, nie widzę nigdzie błędu w tym co piszesz. Szczerze mówiąc nie mam pomysłu bo dziwne jest to że Ci to nie działa, jedyne co mi przychodzi do głowy to zamiast mysql_fetch_assoc użyć mysql_fetch_row do pobierania wierszy. Nigdy nie używałem assoca zawsze pobierałem fetch_row, wątpię że ma to znaczenie ale wiele dziwnych rzeczy widziałem już w życiu.

Podaj jeszcze na wszelki wypadek wersje phpa na serwerze i spróbuj podmienić sposób wyświetlania na:

while ($row = mysql_fetch_row($z)) {
    echo $row[0] + " - " + $row[1];
    echo '<br />';
}

Problemem może być jeszcze wersja phpa, ogólnie funkcje myql są nieaktualne od wersji 5.5, a w 7.0 porzucone. Od dawna używa się mysqli.


(dj1sklero) #18

podmiana aliasu nie pomogła, wersja PHP 5.6.30-0+deb8u1


(Fizyda) #19

Nie chodzi o alias lecz o sposób obsługi danych przez php. Obawiam się że może to być jakiś pierdołowaty błąd z literówką na czele ponieważ to co masz musi działać, ja raczej bez wglądu w kod i bazę nie jestem w stanie stwierdzić co może być przyczyną jeśli wszystko co do tej pory pisałem sprawdziłeś dobrze.