MYSQL - Sumowanie wybranych pól dla danej godziny

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? :)

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ę...

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:

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
}
]
},

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ć?
2

Może tak

select sum(users), hour(time) as sh
from pages_users
where server_id = 1
group by sh
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ą.

0

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

SELECT SUM(users), HOUR(TIME) AS sh
FROM pages_users
WHERE server_id = 1
GROUP BY sh
LIMIT 12
OFFSET 24-12
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":

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.

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:

SELECT SUM(users), HOUR(TIME) AS sh FROM servers_users WHERE account_id = "'.$user['id'].'" GROUP BY sh LIMIT 24
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 :

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
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1