[PHP] [MySQL] GROUP BY / ORDER BY

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Hapablap, 18. November 2009 .

Schlagworte:
  1. 18. November 2009
    [MySQL] GROUP BY / ORDER BY

    Hi Leute,

    ich möchte meinen Autocompleter optimieren. Wenn jemand etwas sucht, dann wird die Suchergebnisanzahl auch protokolliert. Diese möchte ich nun ausgeben. Folgendes Problem entsteht hierbei (statt nem Timestamp verwende ich verständnishalber mal eben Uhrzeiten).

    Felder: id, suchbegriff, counter, tstamp

    Eintrag 1: 1, test, 2, 15 Uhr
    Eintrag 2: 2, test, 5, 16 Uhr

    Jetzt mache ich meine Query:
    SELECT suchbegriff, counter FROM suchprotokoll WHERE value = 'test' GROUP BY value

    So, dann bekomme ich jedoch test, 2. Hab etwas gegoogelt und die Funktion Max gefunden. Wäre ja schön, wenns klappen würde, aber die gibt mir ja nur den höchsten Wert zurück. Es könnte aber sein, dass um 17 Uhr der Counter auf 4 steht, dann krieg ich trotzdem 5 zurück, was nicht gut ist.

    Weiß da jemand eine Lösung? Ich hab gelesen, dies sei das bekannte ORDER BY vor GROUP BY Problem.

    Danke schon mal,
    Hapablap
     
  2. 18. November 2009
    AW: [MySQL] GROUP BY / ORDER BY

    In deinem Query soll in der where Klausel bestimmt value == suchbegriff sein?

    Also

    Code:
    SELECT suchbegriff, counter 
    FROM suchprotokoll 
    WHERE suchbegriff = 'test' GROUP BY suchbegriff
    korrekt?

    Du gruppierst über "suchgbegriff". Schonmal gut um halt nach den einzelnen Suchbegriffen zu gruppieren. Wenn du MAX auf den counter machst, dann wird er dir pro Suchbegriff halt nur den max. Wert ausgeben. Wenn du den auch pro Stunde willst, dann musst du noch nach Stunde gruppieren.

    Also sowas wie

    Code:
    SELECT suchbegriff, MAX(counter), HOUR(tstamp) 
    FROM suchprotokoll 
    WHERE suchbegriff = 'test' GROUP BY suchbegriff, HOUR(tstamp)

    Hab grad keine DB zur Hand, deswegen weiß ich nicht obs funktioniert. Aber evtl. ist es ein Denkanstoß
     
  3. 18. November 2009
    AW: [MySQL] GROUP BY / ORDER BY

    Inder sieht das völlig korrekt. Wenn du MAX() auf gruppierte Ergebnisse anwendest, bekommt du das Maximum pro Gruppe und nicht das Gesamt-Maximum.

    D.h. es wird dir zu jedem Suchbegriff die maximale Anzahl an Treffern zurückgegeben. Wie Inder bereits erwähnte, musst du auch nach Uhrzeit gruppieren, falls du diese mit ausgeben möchtest.

    Bei Gruppen gibt es nur 2 Mögliche Ausgaben:
    - das (die) Element(e), nach denen gruppiert wird
    - das (die) Ergebniss(e) von funktionen(Aggregatfunktionen) wie MAX() und MIN()

    Alle anderen Ausgaben verursachen Probleme aber das geht glaub ich an deiner Frage vorbei ^^

    mfg
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.