split.s: mysql: HAVING

Hi,

habe folgendes Problem mit HAVING:

id | name | datum | nachricht
1 | Daniel | 2009-10-10 14:13:21 | hmm
2 | Otto   | 2009-10-11 04:23:31 | na wie gehts
3 | Daniel | 2009-10-12 10:22:31 | blabla

Jetzt will ich die namen Namen gruppieren:

SELECT id,nachricht FROM nachrichten GROUP BY name HAVING MAX(datum)

Zweck: Ich möchte von jedem User nur die letzte Nachricht anzeigen.
Das Ergebnis müsste eigentlich so aussehen:

3 blabla
2 na wie gehts

Leider ignoriert er aber scheinbar das HAVING komplett und zeigt anstelle dessen

1 | hmm
2 | na wie gehts

  1. Hallo,

    HAVING MAX(datum) ist ja so auch nicht wirklich vollständig. Das ist ungefähr genauso als wenn du schreibst WHERE datum.

    Ausserdem ist deine Problemstellung nicht mit HAVING zu lösen sondern mit einer korrelierenden Unterabfrage

    SELECT n1.id, n1.name, n1.datum, n1.nachricht
    FROM nachrichten n1
    WHERE datum =
    (SELECT max(datum)
    FROM nachrichten n2 where n2.name = n1.name)

    oder mit einem Join

    SELECT n1.id, n1.name, n1.datum, n1.nachricht
    FROM nachrichten n1
    INNER JOIN (Select name, max(datum)  as maxdatum
    FROM nachrichten
    GROUP BY name) n2
    on n1.name = n2.name
    and n1.datum = n2.maxdatum

    Gruss, Frank

    1. ALTER SCHWEDE!
      Das SUBSELECT dauert ja fast 3 Minuten bei ca. 1 Mio Datensätzen was ja noch relativ wenig ist!

      1. Hi!

        Das SUBSELECT dauert ja fast 3 Minuten bei ca. 1 Mio Datensätzen was ja noch relativ wenig ist!

        Welche nicht gesetzten Indexe werden dazu nicht verwendet?

        Lo!