• Willkommen, Gast!
  • Freitag, 30. Oktober 2020, 03:06:27
Position: Home » Allgemeines » Allgemeines Board » MySQL Abfragen Problem.
Antworten
Thema: MySQL Abfragen Problem. [Seite 1 ]

Kein neuer Beitrag KingGO , 13.06.2012, 21:54
Beitrag #1   

IP: n/a
Rang: * * * * * * *
Registrierung: 17.05.2007, 20:49
Homepage: http://www.donotart.de
Wohnort: Magdeburg
 

Forum-Gott mit 404 Punkte, 316 Beiträge
MySQL Abfragen Problem.

Hallo ich habe eine Tabelle

SQL:
1
2
3
4
CREATE TABLE IF NOT EXISTS `dnacms_webstats_ip` (
  `timestamp` int(15NOT NULL,
  `ip` varchar(15DEFAULT NULL
)


In der Tabelle werden de Zugriffe der letzten 48 Std. gespeichert ich möchte die letzten 24 Stunden
ausgewertet bekommen.

in dieser Form:

Stunde: 0-23 | Counts in dieser Stunde.

Habe schon mal etwas rum probiert mit BETWEEN / SUB_DATE(...) und Multiplen SQL Abfragen. Aber
komme auf keinen Grünen Zweig. :/ Brauche da mal einen Denkanstoß.

Aktuell läuft es so...

PHP:
1
2
3
4
5
6
7
8
  for($Stunde=23$Stunde>=0$Stunde--)
  {
    $anfangStunde = mktime(date("H")-$Stunde00date("n"), date("j"), date("Y")) ;
    $endeStunde = mktime(date("H")-$Stunde5959date("n"), date("j"), date("Y")) ;
    $abfrage=mysql_query("SELECT COUNT(`ip`) FROM `dnacms_webstats_ip` WHERE `timestamp` >= '$anfangStunde' AND `timestamp` <= '$endeStunde';");
    $User=mysql_result($abfrage,0,0);
    mysql_free_result($abfrage);
  }


da wird aber 23x eine Abfrage gestartet. Das geht sicher auch anders.

Gruß :-)

 
Kein neuer Beitrag Nils , 13.06.2012, 22:54
Beitrag #2   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Hallo,

du könntest den Timestamp durch 3600 teilen, so dass jeder Timestamp innerhalb einer Stunde auf die
gleiche Zahl gemappt wird und danach groupen. Also so in etwa:
SQL:
1
2
3
SELECT COUNT(*), FLOOR(timestamp / 3600) % 24 AS hour
FROM `dnacms_webstats_ip`
GROUP BY hour

Dann bekommst du für jede Stunde die Anzahl der Requests.

mfg Nils
Dieser Beitrag wurde insgesamt 2 mal editiert. Das letzte Mal 13.06.2012, 23:28 von Nils.

 
Kein neuer Beitrag Rafioso , 13.06.2012, 23:12
Beitrag #3   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Hi,

oder direkt als MySQL-Date(time)-Format abspeichern und mittels MySQL-Date-Funktionen den Range
auslesen, statt diese Art des Timestamps zu verwenden und dann nur via Umrechnungen ans Ergebnis zu
kommen.

Viele Grüße
Rafioso


Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------

 
Kein neuer Beitrag KingGO , 13.06.2012, 23:49
Beitrag #4   

IP: n/a
Rang: * * * * * * *
Registrierung: 17.05.2007, 20:49
Homepage: http://www.donotart.de
Wohnort: Magdeburg
 

Forum-Gott mit 404 Punkte, 316 Beiträge
Danke euch beiden, Nils seine Sache funktioniert schon sehr gut. Allerdings habe ich jetzt noch
Probleme das Hour -2 Stunden ist. Lese mir gerade die Dokumentation zu den Date Funktionen von
MySQL durch.

 
Kein neuer Beitrag Rafioso , 14.06.2012, 23:01
Beitrag #5   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Hi,

- 2 Stunden? Könnte das die Sommerzeit sein? Oder verstehe ich dich nur falsch :/
Der Timestamp wird wohl in GMT +/- 0 gespeichert. Wir haben aktuell aber GMT +2.

SQL:
1
2
3
SELECT COUNT(*), FLOOR((timestamp+7200) / 3600) % 24 AS hour
FROM `dnacms_webstats_ip`
GROUP BY hour


Viele Grüße
Rafioso

Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------
Dieser Beitrag wurde insgesamt 4 mal editiert. Das letzte Mal 14.06.2012, 23:21 von Rafioso.

 
Kein neuer Beitrag KingGO , 16.06.2012, 10:14
Beitrag #6   

IP: n/a
Rang: * * * * * * *
Registrierung: 17.05.2007, 20:49
Homepage: http://www.donotart.de
Wohnort: Magdeburg
 

Forum-Gott mit 404 Punkte, 316 Beiträge
Habe die Lösung des Problems gefunden.

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT FROM_UNIXTIME( TIME ) , counter
FROM (

SELECT FLOOR( TIMESTAMP /3600 ) *3600 AS TIME, COUNT( * ) AS counter
FROM dnacms_webstats_ip
GROUP BY TIME
)temp
WHERE TIME > FLOOR( (
UNIX_TIMESTAMP( NOW( ) ) -86400 ) /3600
) *3600


Ausgabe:
Code:
1
2
3
4
5
6
7
8
9
from_unixtime(time)   counter
2012-06-15 11:00:00   1
2012-06-15 12:00:00   1
2012-06-15 16:00:00   1
2012-06-15 17:00:00   2
2012-06-15 19:00:00   1
2012-06-15 20:00:00   2
2012-06-15 21:00:00   1
2012-06-15 23:00:00   2


Danke für die Unterstützung. ;-)

 
Kein neuer Beitrag Rafioso , 17.06.2012, 01:14
Beitrag #7   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Hi,

wieso erstellst du dafür einen Sub-Query? Hast du meine Erweiterung von Nils seinem Code getestet?
Bei mir hat's funktioniert.

Hier nochmal überarbeitet, damit nur die Einträge vom aktuellen Tag ausgelesen werden:

SQL:
1
2
3
4
SELECT COUNT(*), FLOOR((timestamp+7200) / 3600) % 24 AS hour
FROM `dnacms_webstats_ip`
WHERE DAY(FROM_UNIXTIME(timestamp)) = DAY(NOW())
GROUP BY hour


Viele Grüße
Rafioso

Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------
Dieser Beitrag wurde insgesamt 1 mal editiert. Das letzte Mal 17.06.2012, 01:15 von Rafioso.

 
Kein neuer Beitrag Nils , 17.06.2012, 08:45
Beitrag #8   

IP: n/a
Rang: * * * * * * *
Registrierung: 01.07.2003, 18:55
Homepage: http://www.script-solution.de
Wohnort: Marburg
 

Forum-Gott mit 7812 Punkte, 7566 Beiträge
Hallo,

es geht natürlich auch ohne Subquery. Aber DAY(FROM_UNIXTIME(timestamp)) = Day(NOW()) ist nicht das
was KingGO möchte, denke ich. Denn das ist ja der Tag im Monat. D.h. du würdest auch von anderen
Monaten Daten kriegen.

Ohne Subquery:
SQL:
1
2
3
4
SELECT FROM_UNIXTIME( FLOOR( TIMESTAMP / 3600 ) * 3600AS TIME, COUNT( * ) AS counter
FROM dnacms_webstats_ip
WHERE FLOOR( TIMESTAMP / 3600 ) * 3600 > FLOOR( ( UNIX_TIMESTAMP( NOW( ) ) - 86400 ) / 3600) * 3600
GROUP BY TIME


mfg Nils

 
Kein neuer Beitrag Rafioso , 17.06.2012, 14:27
Beitrag #9   

IP: n/a
Rang: * * * * * * *
Registrierung: 30.08.2006, 22:31
Homepage: http://HomepageStarter.de
Wohnort: O-BW
 

Forum-Gott mit 1723 Punkte, 1537 Beiträge
Hi,

da hast du natürlich recht - habe ich nicht beachtet, könnte man aber mit einem

SQL:
1
WHERE DAYOFYEAR(FROM_UNIXTIME(timestamp)) = DAYOFYEAR(NOW()) AND YEAR(FROM_UNIXTIME(timestamp)) = YEAR(NOW())


umgehen.

MfG
Rafioso

Aktuellste Boardsolution-Version: v1.46
Kommende Boardsolution-Version: TBA
-----------------------------------------------------
Ich erstelle nur noch Modifikationen
für aktuelle Versionen!
-----------------------------------------------------

 
Kein neuer Beitrag KingGO , 17.06.2012, 16:40
Beitrag #10   

IP: n/a
Rang: * * * * * * *
Registrierung: 17.05.2007, 20:49
Homepage: http://www.donotart.de
Wohnort: Magdeburg
 

Forum-Gott mit 404 Punkte, 316 Beiträge
zugegeben das Query und der nachfolgende Code ist nicht ganz auf meinen Mist gewachsen. Das
Resultat ist das hier:

uploads/stats.png

Falls es mal jemand nachbauen möchte muss er nur meine Datenbank Klasse mit den Funktionen von
MySQL ersetzen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
      <table>
        <tr class="table-top">
          <td colspan="24">Letzten 24 Stunden</td>
        </tr>
        <tr valign="bottom" height="180">
<?php
  $last_24 = $db->query("SELECT FROM_UNIXTIME( TIME ) AS hour , counter FROM ( SELECT FLOOR( TIMESTAMP /3600 ) *3600 AS TIME, COUNT( * ) AS counter FROM dnacms_webstats_ip GROUP BY TIME) temp WHERE TIME > FLOOR( (UNIX_TIMESTAMP( NOW( ) ) -86400 ) /3600) *3600");
  $last_24_array = array();
  
  while($line_last_24 = $db->fetchRow($last_24)){
    $last_24_array[strtotime($line_last_24['hour'])] = $line_last_24["counter"];
  }
  $current = floor(time()/3600)*3600;
  $heute_null = date("d"time()).' 00';
  for($i = ($current - 60*60*23); $i <= $current$i += 60*60){
    if (isset($last_24_array[$i]) == ""$value = 0else $value = $last_24_array[$i];
    if (isset($last_24_array[$i]) && max($last_24_array) > 0) {$bar_hight=round((170/max($last_24_array))*$value);} else $bar_hight = 0;
    if ($bar_hight == 0$bar_hight = 1;
    if(isset($last_24_array[$i])){
      echo '<td width="19"><div class="bar" style="height:'.$bar_hight.'px;" title="'.date("H:i"$i).' Uhr - '.$value.' Besucher"></div></td>';  
    }elseif(date("d H"$i) == $heute_null){
      echo '<td width="19" style="border-left: #C4E0FB 2px dashed;"><div class="bar" style="height:'.$bar_hight.'px;" title="'.date("H:i"$i).' Uhr - '.$value.' Besucher"></div></td>';  
    }else{
      echo '<td width="19"><div class="bar" style="height:'.$bar_hight.'px;" title="'.date("H:i"$i).' Uhr - '.$value.' Besucher"></div></td>';
    }
  }
?>
        </tr>
        <tr height="20">
          <td colspan="6" class="timeline"><?php echo date("H:i",mktime(date("H")-2300date("n"), date("j"), date("Y"))); ?> Uhr</td>
          <td colspan="6" class="timeline"><?php echo date("H:i",mktime(date("H")-1700date("n"), date("j"), date("Y"))); ?> Uhr</td>
          <td colspan="6" class="timeline"><?php echo date("H:i",mktime(date("H")-1100date("n"), date("j"), date("Y"))); ?> Uhr</td>
          <td colspan="6" class="timeline"><?php echo date("H:i",mktime(date("H")-500date("n"), date("j"), date("Y"))); ?> Uhr</td>
        </tr>
      </table>
Anhänge:
stats.png 20.266 Bytes 7 Downloads

Abonnieren Druckansicht
Antworten

n/a n/a 1     (Anzeige: 1 – 10; insgesamt: 10) n/a n/a
User in diesem Thema: 0 Registrierte, 0 Versteckte, 1 Gast, 0 Bots
Keine
Legende: Administratoren, User, Moderatoren
Themenaktionen:
Beiträge verschieben

Toggle Ähnliche Themen zu „MySQL Abfragen Problem.“
  Antworten Aufrufe Themeneröffnung Letzter Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Seitenzahlen in PHP (MySQL) auflistung einbri ... 6 64176 08.07.2015, 21:39
Von: RommY
13.07.2015, 12:43
Von: RommY Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Installationsproblem   Seiten 1 2 ] 15 56504 15.01.2013, 10:35
Von: Dieter
03.09.2013, 09:23
Von: Dieter Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  GD Problem   Seiten 1 2 ] 15 41919 29.06.2013, 18:19
Von: Mars
16.07.2013, 13:08
Von: Rafioso Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  MySQL Version / Boardpfad Fehler bei Installa ... 3 21141 19.04.2013, 09:55
Von: ckragt
20.04.2013, 23:51
Von: Nils Zum letzten Beitrag
Keine neuen Beiträge, nicht wichtig Keine neuen Beiträge, „heißes Thema“
Keine neuen Beiträge, offen Keine neuen Beiträge, nicht verschoben
  Namespace Problem 2 20355 12.01.2013, 10:33
Von: Mars
12.01.2013, 19:03
Von: Mars Zum letzten Beitrag
  • 0.028261 Sek., 12 DB-Zugriffe, 1.019 MiB
  • Powered by Boardsolution v1.46