Bastian Schnitzler: MySQL: Verschachtelung von MAX und COUNT

In einem Query zaehle ich zunaechst per Count die Reihen, jetzt moechte ich hiervon das Maximum ermitteln, was aber den Fehler "Invalid Use of Group Functions" mit sich bringt. Wenn ich die Daten in PHP behandle, laedt es mir zu lange.

Mein Query ist:

select c1.date, c1.IP, c2.date as c2date, c2.IP as c2IP, (COUNT(*) + 1) as Anzahl
FROM useronline c1
CROSS JOIN useronline c2
WHERE c1.date < DATE_ADD(c2.date, INTERVAL 1 minute) AND c1.date > DATE_SUB(c2.date,
INTERVAL 1 minute) AND c1.IP != c2.IP
GROUP BY c1.date
ORDER BY Anzahl DESC, c1.date DESC

und ist dazu gedacht, die maximale Anzahl an Usern zu ermitteln, die gleichzeitig online waren. Hat jemand eine Idee wie ich das mit dem Maximum hinbekomme?

  1. hi,

    Mein Query ist:

    "funktioniert" diese so, oder bringt die bereits den fehler?

    und ist dazu gedacht, die maximale Anzahl an Usern zu ermitteln, die gleichzeitig online waren. Hat jemand eine Idee wie ich das mit dem Maximum hinbekomme?

    nach der anzahl lässt du doch schon absteigend sortieren.
    wenn die query also funktioniert, könntest du versuchen sie noch mit LIMIT zu kombinieren, um wirklich nur den einen datensatz mit der höchsten anzahl zu bekommen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. yo,

    select c1.date, c1.IP, c2.date as c2date, c2.IP as c2IP, (COUNT(*) + 1) as Anzahl
    FROM useronline c1
    CROSS JOIN useronline c2
    WHERE c1.date < DATE_ADD(c2.date, INTERVAL 1 minute) AND c1.date > DATE_SUB(c2.date,
    INTERVAL 1 minute) AND c1.IP != c2.IP
    GROUP BY c1.date
    ORDER BY Anzahl DESC, c1.date DESC

    zum einen solltest du alle spalten (ausgenommen aggregat-funktionen), die du ausgeben willst, auch in die group by klausel mit reinnehmen. normalerweise geben alle rdbms sonst eine fehlermeldung aus, nur mysql probiert da einen anderen weg zu gehen, von dem ich aber abraten würde.

    zum anderen gruppierst du über die date spalte und dabei werden alle datensätze in die gleiche gruppe reingenommen, die auch den gleichen wert für date besitzen, was sich auf die aggregat-funktion auswirken wird. was du aber willst, ist sicherlich eine gewissen zeitspanne geben, damit sie als gleichzeitig online gelten.

    auch ist mir der cross join mit seiner where klausel auf den ersten blick unheimlich. c1 soll kleiner sein als ein bestimmter wert + Intervall und dann wieder größer. und beides wird mit einem logischen AND verbunden. das ist mir noch nicht ganz klar.

    Ilja