Kalle_B: GROUP BY - nur zufällig richtig?

Beitrag lesen

hallo, Hotte,

das kenne ich, guck mal: hier

danke für den Link. Die darin enthaltene Aussage "... nimmt mysql eben einen zufälligen wert der in der jeweiligen gruppierung enthalten ist" klingt nicht nach Systematik.

Da brauche ich also einen neuen Ansatz. Meine Problemstellung:

In einen Veranstaltungskalender geben viele User Termine ein. Ich möchte die 10 zuletzt eingegebenen Veranstaltungen anzeigen, aber pro User nur einen.

Im Klartext: Wenn User 4711 zehn Termine kurz nacheinander eingibt, soll nur sein zuletzt eingegebener angezeigt werden.

An zweiter Stelle der Liste steht der vorletze User mit seinem letzten Termin usw.

Ich hatte das mit einem Subselect gelöst, zwar korrekt, aber schlecht für die Performance:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
# DIE LETZTEN 10 NEUERFASSUNGEN  
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
SELECT  
 trm1.id         trm_id  
,trm1.titel      trm_titel  
,trm1.tag        trm_tag  
,trm1.uhr        trm_uhr  
,trm1.zeit_neu   trm_zeit_neu  
,ort1.id         ort_id  
,ort1.plz        ort_plz  
,ort1.name       ort_name  
FROM     ( ".$db[0]['termine']." trm1  
          ,".$db[0]['orte']."    ort1)  
LEFT JOIN (".$db[0]['adressen']." adr1)  
ON        (adr1.id = trm1.veranstalter_id)  
  
WHERE     trm1.owner_id  = ".$owner_id."  
AND       trm1.intern_kz = 0  
AND       ort1.id = trm1.ort_id  
AND       trm1.zeit_neu =  
(  
  SELECT  
   max( trm2.zeit_neu )  
  FROM      ".$db[0]['termine']." trm2  
  WHERE trm2.veranstalter_id = trm1.veranstalter_id  
)  
ORDER BY trm1.zeit_neu DESC  
LIMIT  0,10  

Nun habe ich mit einem schnellen SQL zwar dasselbe Ergebnis, aber eben nur zufällig:

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
# DIE LETZTEN 10 NEUERFASSUNGEN  
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
SELECT  
 trm1.id            trm_id  
,trm1.titel         trm_titel  
,trm1.tag           trm_tag  
,trm1.uhr           trm_uhr  
,min(trm1.zeit_neu) trm_zeit_neu  
,ort1.id            ort_id  
,ort1.plz           ort_plz  
,ort1.name          ort_name  
  
FROM      ".$db[0]['termine']." trm1  
  
LEFT JOIN ".$db[0]['orte']." ort1  
ON        ort1.id = trm1.ort_id  
  
WHERE     trm1.owner_id       = ".$owner_id."  
AND       trm1.veranstalter_id > 0  
AND       trm1.intern_kz = 0  
  
GROUP BY  trm1.veranstalter_id  
ORDER BY  trm1.zeit_neu DESC  
LIMIT  0,10  

Brauche mal einen Anstoss, stehe im Moment auf dem Schlauch.

Kalle