MySQL-Abfrage gesucht

Alles rund um die Software-Entwicklung: Programme, Skripte, Projekte etc.
Antworten
Benutzeravatar
Epfi
Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 10520
Registriert: 08.03.2004, 11:02
Wohnort: Haus, das Verrückte macht
Kontaktdaten:

MySQL-Abfrage gesucht

Ungelesener Beitrag von Epfi » 22.07.2010, 13:04

Moin!

Ich habe eine Datenbank, in der ein riesiger Haufen an Vorgängen mit Zeitstempel gelogt ist.

Nun möchte ich eine Abfrage haben, die mir im Prinzip folgendes zurückgibt:

Code: Alles auswählen

startzeit = startzeit; //startzeit: bekannter Wert
for (i = 0; i < durchläufe; i++){
    startzeit += intervall;
    endzeit = startzeit + intervall;

    sql = "SELECT COUNT(*) FROM `logs` WHERE `zeit` > 'startzeit' AND `zeit` < 'endzeit' ";
    result = mysql(sql);
}
Nur ohne die Schleife außenrum - die hätte ich gern irgendwie ins SQL verlegt. Natürlich ohne Schleife.
hartware.net - *** ****** ***, ** ************ **** **** *********** ****.

Benutzeravatar
fassy
Vice Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 5855
Registriert: 26.01.2004, 20:44
Wohnort: Hamburg

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von fassy » 22.07.2010, 13:19

Wäre eine stored procedure eine Möglichkeit? Damit ginge es recht einfach.
Pick up the hammer... pick it up.

Benutzeravatar
Konsumierer
Rear Admiral
Beiträge: 3621
Registriert: 08.03.2004, 20:58
Wohnort: Stuttgart
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Konsumierer » 22.07.2010, 14:09

Kann MySQL Rekursion?
#GeorgeWBush { position:absolute; bottom:-6ft; }

Benutzeravatar
Epfi
Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 10520
Registriert: 08.03.2004, 11:02
Wohnort: Haus, das Verrückte macht
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Epfi » 22.07.2010, 15:51

Mein eigentliches Problem ist, dass die Abfrage mit dem Geschleife elendig lang dauert. Wird das mit stored procedures besser?

Rekursion: keine Ahnung, ob das geht.
hartware.net - *** ****** ***, ** ************ **** **** *********** ****.

Benutzeravatar
fassy
Vice Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 5855
Registriert: 26.01.2004, 20:44
Wohnort: Hamburg

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von fassy » 22.07.2010, 16:16

Die Stored Procedure ist auf jeden Fall schneller als eine Menge calls aus python oder Java - aber ob das schnell genug ist, musst du einfach mal ausprobieren.

du könntest wenn es die Sprache hergibt in der Schleife auch mal PreparedStatements (wenn in der verwendeten Sprache verfügbar) verwenden. Das sollte die ganze Sache auch deutlich beschleunigen.

Du kannst in MySQL kein rekursiven Queries bauen soweit ich weiß.
Zuletzt geändert von fassy am 22.07.2010, 16:17, insgesamt 1-mal geändert.
Pick up the hammer... pick it up.

Benutzeravatar
Epfi
Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 10520
Registriert: 08.03.2004, 11:02
Wohnort: Haus, das Verrückte macht
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Epfi » 22.07.2010, 16:31

Prepared statements mit PHP sollte gehen.

Dann werde ich mir das mal angucken. Prepared statements wollte ich sowieso schon länger mal lernen... Und wenn das nichts hilft, guck ich mir noch stored procedures an.
hartware.net - *** ****** ***, ** ************ **** **** *********** ****.

Benutzeravatar
fassy
Vice Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 5855
Registriert: 26.01.2004, 20:44
Wohnort: Hamburg

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von fassy » 22.07.2010, 16:39

Epfi hat geschrieben:Prepared statements mit PHP sollte gehen.

Dann werde ich mir das mal angucken. Prepared statements wollte ich sowieso schon länger mal lernen...
solltest du auf jeden Fall.

http://www.goldmann.de/php-51-abstrakti ... p_346.html

Vor der Schleife den Query erzeugen und in der Schleife nur noch die Parameter binden und ausführen. Ich verwende fast ausschließlich PreparedStatements. Weiterer Vorteil ist auch die Typsicherheit, sprich kein String escapen mehr oder Sorge um SQLInjections
Pick up the hammer... pick it up.

Benutzeravatar
Epfi
Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 10520
Registriert: 08.03.2004, 11:02
Wohnort: Haus, das Verrückte macht
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Epfi » 22.07.2010, 17:20

Wollte es hauptsächlich auch wegen der Sicherheit lernen. Wobei mir jetzt schon ein paar mal Skripte von anderen Menschen untergelaufen sind, wo ich mir sicher bin, dass sich Skript-Kiddies erstmal dort austoben werden, bevor sie bei mir anfangen ;)

Code: Alles auswählen

$sql = "INSERT INTO `tabelle` (`feld`) VALUES ('$_POST["wert_vom_benutzer"]');
Um sowas auf seine eigene Seite zu packen muss man schon echt schmerzbefreit sein...
Zuletzt geändert von Epfi am 22.07.2010, 17:21, insgesamt 1-mal geändert.
hartware.net - *** ****** ***, ** ************ **** **** *********** ****.

Benutzeravatar
fassy
Vice Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 5855
Registriert: 26.01.2004, 20:44
Wohnort: Hamburg

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von fassy » 22.07.2010, 17:41

Bild

Du glaubst nicht was ich jeden Tag an Code sehe... Ich hatte neulich mal ein Oracle Security Schulung und was der Kollege da gezaubert hat, hat mich wirklich vom Glauben abfallen lassen.

Such mal nach 'ociexecute "ora 01756"' bei Google. All diese Seiten haben schon mal kritische SQLInjections, und das beste daran - Google dient als Vulnarability Scanner :D
Pick up the hammer... pick it up.

Leviathan
Captain
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 872
Registriert: 08.03.2004, 17:09
Wohnort: Kiel
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Leviathan » 25.07.2010, 10:27

Unter der Annahme, dass du eigentlich eine Übersicht haben willst, die für bestimmte Zeiträume anzeigt, wieviele Log-Einträge vorhanden sind, würde auch das hier funktionieren:

Code: Alles auswählen

SELECT DATE_FORMAT(`zeit`, '%Y-%m-%d %H'), COUNT(*)
FROM `logs`
GROUP BY DATE_FORMAT(`zeit`, '%Y-%m-%d %H')
Das zeigt dir für jede Stunde an, wieviele Einträge vorliegen. Für andere Intervalle muss der GROUP-BY-Ausdruck entsprechend anpasst werden.


P.S.: Für Ausdrücke der Art "`zeit` > 'startzeit' AND `zeit` < 'endzeit'" gibts extra nen eigenen Operator: http://dev.mysql.com/doc/refman/5.1/en/ ... or_between

Benutzeravatar
Epfi
Admiral
Turtleboard Veteran
Turtleboard Veteran
Beiträge: 10520
Registriert: 08.03.2004, 11:02
Wohnort: Haus, das Verrückte macht
Kontaktdaten:

Re: MySQL-Abfrage gesucht

Ungelesener Beitrag von Epfi » 25.07.2010, 11:38

@levi: Ja, genau das ist eigentlich mein Ziel. Group By hatte ich auch schon irgendwie im Sinn, habe das aber mit meinen sehr elementaren MySQL-Kenntnissen nicht verwurstet bekommen. Werde das später mal ausprobieren - danke für den Tipp! Den Intervalloperator werde ich auf jeden Fall auch in mein Vokabular aufnehmen, klingt praktisch.

EDIT: Super - klappt! Und das php-Skript ist auch direkt mal um etliche Zeilen geschrumpft. Besten Dank!

Code: Alles auswählen

SELECT DATE_FORMAT(FROM_UNIXTIME(`zeit`), '%Y-%v') as `jahr_woche`, COUNT(*)
FROM `logs`
GROUP BY DATE_FORMAT(FROM_UNIXTIME(`zeit`), '%Y-%v')
ORDER BY `jahr_woche`
EDIT2: Ist das ein Bug in MySQL oder muss das so?
Ich hole mir alle Datensätze, die er in KW 1/2008 einsortieren würde:

Code: Alles auswählen

SELECT `zeit` FROM `log` WHERE DATE_FORMAT(FROM_UNIXTIME(`zeit`), '%Y-%v') = '2008-01'
Erster Treffer:

Code: Alles auswählen

1230505202 = Realzeit: 29.12.2008 - 00:00:02
Letzter Treffer:

Code: Alles auswählen

1230764073 = Realzeit: 31.12.2008 - 23:54:33
(wer zur Hölle treibt sich am 31.12. um 23:54 auf meiner Seite rum??)

29.12. - 31.12. 2008 waren tatsächlich schon KW 1, aber nicht im Jahr 2008, sondern 2009 und entsprechend müsste ich die Treffer in der Gruppe '2009-01' finden und nicht '2008-01'.

Live-EDIT: Man muss %u nutzen, nicht %v - dann stimmt es.
Zuletzt geändert von Epfi am 25.07.2010, 12:26, insgesamt 3-mal geändert.
hartware.net - *** ****** ***, ** ************ **** **** *********** ****.

Antworten