MySQL SELECT DISTINCT .... Vorfilterung?

  • Hallo zusammen,

    folgendes, ich habe eine SQL Tabelle mit vielen Datensätze. Jeder Datensatz enthält im Feld datum das Datum wann der Datensatz eingetragen wurde.

    Feld datum ist int(20) und enthält einen time() Eintrag.

    Jetzt möchte ich per „SELECT DISTINCT datum FROM“ nur die Monate aus dem Feld datum ausgeben werden.

    Bekomme ich das über SELECT Abfrage hin, oder muss ich in der Tabelle ein weiteres Feld einfügen und nur die Monate eintragen lassen um anschließend dann darüber Filtern zu können?


    Ich sage schon mal Danke Oliver

  • Falscher anstazt. Ich weiss zwar nicht genau ob es sowas wie die date-funtkion auch in MySQL gibt, ich denke aber schon.
    Lass doch einfach nach datum (bzw. deinem Timestamp) vorsortierne und pick dir den Monat per PHP raus - ist sogar performanter.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • ist sogar performanter.


    Das ist Quatsch! Wieso soll ich mit PHP sortieren und Filtern, wenn ich das schon mit MySQL erledigen kann. Es wäre einfacher, wenn man in der Tabellenspalte Datum auch ein Datum speichert, also vom Type date. Dafür gibt's das nämlich

  • Es wäre einfacher, wenn man in der Tabellenspalte Datum auch ein Datum speichert, also vom Type date. Dafür gibt's das nämlich


    So ist es aber nicht. Wenn er die MySQL DATE funktion verwendet, muss MySQL für JEDEN Datensatz, also ganz egal, ob er hinterher im resultat ersccheint, die Funktion ausführen. Wenn PHP die Funktion allerdings nur auf die relevaten anwendet, ist das natürlich performanter.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Und bei einem Timestamp wirst du kein Distinct sinnvoll einsetzen können. Mit anderen Worten, du musst alle Datensätze aus der DB auslesen und dann mit PHP filtern. Und das soll performanter sein? Im Leben nicht!
    Die Spalte datum von timestamp nach date konvertieren ist ja keine gigantischer Akt.

  • So, mein lieber Tobse! Habe gerade etwas Zeit gehabt und mal getestet:

    Select distinct month(datum) as monate from tabelle

    Da braucht phpMyAdmin bei einer Tabelle mit 500.000 Datensätzen gerade mal 0.25 Sekunden. Mach das mal mit deiner Methode.

  • Für Datums-Felder nimmt man auch die Datums-Feldtypen von MySQL, dafür gibt es die. Ein INT ist eine schlechte Idee, warum zeigt sich hier mal wieder. Du brauchst im Query jedesmal eine Funktion mehr wenn du Datums-Berechnungen/-Formatierungen in der Abfrage durchführen willst. Und das ist performanter als PHP rödeln zu lassen.

    SQL
    SELECT
      DISTINCT DATE_FORMAT( FROM_UNIXTIME(`datum`), '%Y-%m')
    FROM
      `table`

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Hallo zusammen,

    vielen Dank für die tolle Diskussion und Antworten!!!

    Warum ich INT Verwende, weis ich nicht genau habe das irgendwo mal übernommen. Auch hier danke für den Tipp, ich werde in Zukunft auf „Datum“ gehen.

    @SinnlosS : Genau solche Schreibweise habe ich gesucht.


    Vielen Dank euch allen, Grüsse Oliver

  • So, mein lieber Tobse! Habe gerade etwas Zeit gehabt und mal getestet:

    Select distinct month(datum) as monate from tabelle

    Da braucht phpMyAdmin bei einer Tabelle mit 500.000 Datensätzen gerade mal 0.25 Sekunden. Mach das mal mit deiner Methode.

    Du vergisst, dass PHPMyAdmin aufgrund von darstellungsplätzen ein LIMIT 0, 30 (oder eben bezüglich der Seite) benitzt, weshalb MySQL 0,25 Sekunden für 30 Datensätze gebraucht hat.

    EDIT:
    Tabelle "timetable":

    Code
    id, INT (5) | time, INT(11)
    ------------+---------------
    1           | 1314359916
    u.s.w. bis 35.158


    Ausgabe:

    Code
    0.116676
    0.094987

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    2 Mal editiert, zuletzt von Tobse (26. August 2011 um 13:55)

  • Setz doch mal bitte bei microtime den Parameter auf true, dein Ergebnis sagt exakt gar nix aus in der Form.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Immernoch schneller.


    Für mich ist das eindeutig. Bei 500.000 Datensätzen wäre der Unterschied noch deutlicher.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Immernoch schneller.
    Für mich ist das eindeutig. Bei 500.000 Datensätzen wäre der Unterschied noch deutlicher.


    Und das ist immer noch Quatsch! Bei 500.000 Datensätzen hast du aller Wahrscheinlichkeit nach auch 500.000 unterschiedliche Timestamps. Und dann geht dein Script völlig in die Knie.

    Und zu phpMyAdmin und deiner Aussage mit Limit 0, 30. Meines Wissens nach gibt es nur 12 Monate.

  • Immernoch schneller.


    Für mich ist das eindeutig. Bei 500.000 Datensätzen wäre der Unterschied noch deutlicher.

    Wunderbar, und jetzt nimm bitte mal kein INT für das Datum, sondern DATE.

    Auf eine Tabelle mit ~650.000 Datensätzen:


    DAS ist ein eindeutiges Ergebnis...

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook


  • DAS ist ein eindeutiges Ergebnis...

    Die Tabelle vom TS IST aber KEIN DATE! Sonst würde ich das ja nicht diskutieren.

    Zitat von Unregistriert


    Tobse wird bestimmt in jeder Row das gleiche Datum haben, dann geht das auch zügig. ;)

    Jetzt wirts aber peinlich. Du hast verloren, zumindest was INTs angeht, sies ein. Du kannst von mier aus auch den DUMP haben unds selbst ausprobieren. Das Niveau sinkt durch deinen Post wieder in unersehliche Tiefe.

    BackToTopic:
    Wir haben gesehen - bei INTs ist PHP schneller, bei DATEs hat PHP absolut keine chance auch nur ansatzweise mitzuhalten. Die Tabelle vom Gast ist INT. Bei INTs braucht PHP rund 0.18 Sekunden. Bei DATEs brauch MySQL rund 0.7 Sekunden.
    Dem TS rate ich daher zu INTs und PHP, er kann alelrdings auch seine Tabelle in DATE umwandeln und MySQL benutzen - völlig egal.

    EDIT: Ahja, der unregistrierte kann mir ja keine PM schreiben, der DUMP im anhang.
    timetable.zip

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

    2 Mal editiert, zuletzt von Tobse (26. August 2011 um 15:41)

  • Die Tabelle vom TS IST aber KEIN DATE! Sonst würde ich das ja nicht diskutieren.


    Und WELCHE ROLLE soll das SPIELEN? Ein Script zum Umschreiben der Daten ist in 5 Minuten erstellt.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Zitat


    Und WELCHE ROLLE soll das SPIELEN? Ein Script zum Umschreiben der Daten ist in 5 Minuten erstellt.


    Er solls sich aussuchen.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!


  • BackToTopic:
    Wir haben gesehen - bei INTs ist PHP schneller, bei DATEs hat PHP absolut keine chance auch nur ansatzweise mitzuhalten. Die Tabelle vom Gast ist INT. Bei INTs braucht PHP rund 0.18 Sekunden. Bei DATEs brauch MySQL rund 0.7 Sekunden.
    Dem TS rate ich daher zu INTs und PHP, er kann alelrdings auch seine Tabelle in DATE umwandeln und MySQL benutzen - völlig egal.


    Ach das fällt mir ja grad erst auf... Junge, schau dir erstmal meinen Code richtig an...
    Ich habe das ganze in einer for-Schleife die 1000x durchlaufen wird, du hast einen Durchlauf. Also bitte...

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook