Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Liczenie wierszy
Forum PHP.pl > Forum > Przedszkole
Aloons
Witam, jak powinno się zliczać wiersze w bazie danych?
Są mi znane 2 opcje:
1. Liczenie poprzez sql count - brak możliwości pomyłki, dłuższy czas
2. Stworzenie zmiennej która będzie aktualizowana po każdej zmianie - możliwość pomyłki, krótszy czas (np kolumny `liczba ocen` w tabeli uczen)

Powiedzmy, że mam w bazie danych tabelkę oceny i chciałbym zliczyć ilość ocen u ucznia.

Tomplus
A co wpisujesz w COUNT?
bo najlepiej użyć
Kod
SELECT COUNT(1) FROM table
Aloons
Cytat(Tomplus @ 3.11.2017, 21:40:02 ) *
A co wpisujesz w COUNT?
bo najlepiej użyć
Kod
SELECT COUNT(1) FROM table

ehhh.... Jest to tylko przykład, pytam się o radę jak profesjonalnie powinno się rozwiązać ten problem, to wszystko.
Tomplus
Ale tutaj nie ma nic więcej, może co najwyżej jeszcze skorzystać z funkcji PDO

  1. $query->rowCount();


Ale dostaniesz wynik po wykonaniu polecenia SELECT, UPDATE, INSERT czy DELETE. Czyli nie musisz odpytywać dwa razy bazy tylko po aby sprawdzić ile jest rekordów.

COUNT(1) jest np. lepsze od COUNT(*) bo mniej obciąża procesor serwera.
sabat24
Cytat
2. Stworzenie zmiennej która będzie aktualizowana po każdej zmianie - możliwość pomyłki, krótszy czas (np kolumny `liczba ocen` w tabeli uczen)

To jest denormalizacja i stosuje się powszechnie w celach optymalizacyjnych. Wszystko zależy od rodzaju obliczeń, częstotliwości zmiany i tego jak czesto odczytujesz daną wartość. Przykładowo jeśli ktoś dodaje post na forum do tematu raz na kilka godzin, a wyświetlenie liczby postów w tematach odbywa się co parę minut, nie ma sensu tego za każdym razem obliczać.

Sama kwestia implementacji i pomyłek.
Po pierwsze możesz to wyrzucić poza logikę aplikacji i zrobić triggery w bazie, które będą aktualizować same wszystkie pola w zależności od zapytań idących do bazy.
Po drugie nie zawsze musisz inkrementować wartość o jeden po akcji dodającej. Jeśli zapis jest rzadki, odczyt częsty i nie do końca chcesz tworzyć całą logikę związaną z inkrementacją, zawsze możesz puścić COUNT po stworzeniu rekordu i zapisać tę wartość, co zwróci.
viking
Widok zmaterializowany.... oh, wait. To mySQL wink.gif
Aloons
ok, dzięki za odpowiedzi

@Tomplus trochę źle zrozumiałem na początku facepalmxd.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.