MYSQL - Sumowanie wybranych pól dla danej godziny

MYSQL - Sumowanie wybranych pól dla danej godziny
K4
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Myślę już trochę jakby to ugryźć i coś nie mogę wymyślić. Otóż mam tabelę w której są trzy kolumny (pomijając id) - server_id, numbers oraz time. Potrzebuję zsumować kolumny numbers, które należą do wybranego rekordu w server_id i mają tę samą datę w time (data jest przechowywana w formacie TIMESTAMP , więc muszę to rozczytać w skrypcie php na format np. H:s). Podrzucicie pomysły lub przykłady bym mógł to zrozumieć i napisać samemu? :)

edytowany 1x, ostatnio: Kamcio4
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:3 dni
  • Postów:2792
0

Mają tę samą datę, czy wartość? Jesli wartość to Group by server_id, time. A jesli data, to zamień w tym grupowaniu Time na funkcję która liczy datę...

K4
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

W sumie no tak. Teraz widzę, że coś nie tak ze mną było w godzinach popołudniowych. Przecież to ogromnie proste. Zrobiłem to jednak przez WHERE:

Kopiuj
SELECT SUM(users) FROM pages_users WHERE server_id = 22 and time = xxxx

Prawdziwy problem dla mnie zaczyna się tutaj:
```
{
type: 'line',
data: {
labels: ['11:00', '12:00', '13:00', '14:00', '15:00'],
datasets: [{
data: [23, 45, 56, 44, 47],
label: "users online",
fill: false
}
]
},

Kopiuj
To część mojego kodu, który tworzy wykres. Chciałbym, aby przedstawiał 24 godzinny ruch na stronie. W **labels** podaje się godziny (co godzinę - max 24 godziny), a w **data** ilość osób online w tamtej godzinie. Jak się za to zabrać?
edytowany 1x, ostatnio: Kamcio4
CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:296
2

Może tak

Kopiuj
select sum(users), hour(time) as sh
from pages_users
where server_id = 1
group by sh
K4
Wow! To naprawdę działa :D Dziękuję bardzo :)
K4
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Ahh, po czasie widzę, że mam jeszcze jeden mały problemik. Wszystko działa perfekcyjnie, tylko gdy na końcu dodam sobie LIMIT 24, to wyświetla mi 24 pierwsze rekordy, a nie ostatnie które mnie interesują.

CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:296
0

To użyj offsetu, np. statystyki dla godzin od 12.00 do 23.00, czyli ostatnie 12 pozycji:

Kopiuj
SELECT SUM(users), HOUR(TIME) AS sh
FROM pages_users
WHERE server_id = 1
GROUP BY sh
LIMIT 12
OFFSET 24-12
K4
Wprawdzie z tym offsetem mi nie podziałało, ale zmieniłem grupowanie z sh na id i na razie hula. Jeśli ja nie będę nic ruszał w tej tabeli to nie powinno być żadnych nieprawidłowości przez grupowanie po id? (skrypt wszystko dodaje)
K4
Oho. Jednak nie. W jednym wykresie działa to dobrze, ale w innym, gdzie łączę parę kolum server_id dla danej godziny to już nie przechodzi. Ogólnie to działa, ale problem jest z północą. Za dnia wszystko wygląda dobrze: 03:00, 07:00, 16:00, 22:00. A po północy zaczyna się psuć grupowanie: 01:00, 02:00, 03:00, 07:00, 16:00, 22:00 <- Dodaje rekordy na początek zamiast po 22:00
CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:296
0

Mogę się domyślać, że po północy nad ranem brak ruchu na stronach i brak wpisów do statystyk, stąd braki. Jeśli tak, to stwórz tabelę lub widok hoursi wygeneruj ciąg wszystkich godzin od 0 do 23 do kolumny hour, i zrób "lewego joina":

Kopiuj
select h.hour, stats.ucount
from hours h
LEFT join (select sum(users) as ucount, HOUR(time) as sh
from pages_users
group by sh) stats 
on stats.sh = h.hour
order by h.hour

Dla brakujących godzin będzie tam NULL, więc sam pokombinuj jak zamienić to na zero. Teraz limit o offset będą działać tak jak trzeba, bo to zapytanie zawsze zwróci 24 wiersze.

K4
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Nie nie, źle mnie zrozumiałeś. Nie mam żadnych braków (ruch na stronie to tylko przykrywka, tak naprawdę zliczam coś innego). Wszystkie dane w bazie są prawidłowe. I też nie chodzi o brak wpisów do statystyk, lecz o grupowanie wyników po godzinie. Nie wyświetla mi wyników tak jak my to liczymy: 23:00, 00:00, 01:00, lecz wyświetla to w ten sposób: 00:00, 01:00, 23:00. Moje zapytanie aktualnie wygląda tak:

Kopiuj
SELECT SUM(users), HOUR(TIME) AS sh FROM servers_users WHERE account_id = "'.$user['id'].'" GROUP BY sh LIMIT 24
edytowany 1x, ostatnio: Kamcio4
CS
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:296
1

Chłopie, pisz jaśniej, bo tak to szkoda czasu. Ostania próba czytania w Twoich intencjach, chodzi o przedział godzinowy np. od 18 do 5? Jeśli tak, to zrób z klauzulą having i unionem :

Kopiuj
select sum(users), HOUR(time) as sh
from servers_users
group by sh
having sh > 17
union 
select sum(users) as hcount, HOUR(time) as sh
from servers_users
group by sh
having sh < 6
K4
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:14
0

Wprawdzie do tego konkretnego przykładu, to zapytanie by się nadało po dodatkowym obliczaniu godzin. Jednak chciałbym je mieć uniwersalne, aby też przy innych wykresach je wykorzystać. Doceniam to, że mi pomagasz. Dzięki. Mimo wszystko, uważam jednak, że to nie jest czytanie w moich intencjach. Ogólnie w tym wątku wspomniałem co mnie dokładnie interesuje (a że wątek się trochę ciągnie to już inna kwestia).

Zbierając do kupy wszystkie informacje:

  • To ma być wykres 24 godzinny
  • Pokazywane mają być najświeższe dane
  • Dane mają być prezentowane od aktualnej godziny do tej samej dnia wczorajszego. Teraz jest godzina 20 (nie licząc minut) i wykres ma pokazywać dane przez ostatnią dobę do wczoraj do godziny 20.

Przepraszam, że się wcześniej nie zrozumieliśmy. Mógłbym liczyć ostatni raz na pomoc? Bardzo mi na tym zależy.

CS
Zmień w poprzednim zapytaniu 17 i 6 na funkcję pobierającą godzinę z bieżącego czasu, i zmień jeden z operatorów z < > na >= lub <= w zależności, gdzie powinna być bieżąca godzina; na początku czy na końcu.
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:3 dni
  • Postów:2792
1

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.