MySQL Group BY sortieren

jenny85

Grünschnabel
hallo, vielleicht kann mir jemand helfen. ich hab ne tabelle mit usern und eine mit nachrichten. jetzt möchte ich einfach den usernamen (tbl user) und den text der letzten mail (tbl nachrichten) ausgeben, aber der gibt immer den ältesten text aus. mache das mit group by nachrichten.userId, wie folgt:

PHP:
SELECT
  n.nutzerId			AS nutzerId,
  n.nickname			AS nickname,
  n.nutzerCode			AS nutzerCode,
  n.geschlecht			AS geschlecht,
  m.text				AS text,
  m.gesendet			AS gesendet
FROM
  nutzer				AS n,
  nachrichten			AS m
WHERE
  m.nutzerIdAn			= '".$login_nutzerId."' 		AND
  m.nutzerIdVon			= n.nutzerId
GROUP BY
  m.nutzerIdVon
ORDER BY
  m.mailId DESC
 
GROUP BY wird dir so wie du ihn eingesetzt hast nicht helfen.
GROUP BY wirkt auf jedes Feld der Ausgabe. Entweder muss das Feld im GROUP BY sein oder mit einer Agregatfunktion (COUNT, SUM, MAX....) behandelt werden.

PHP:
SELECT name, COUNT(irgenwas) FROM tabelle GROUP BY name)

Du willst mit LIMIT arbeiten.
PHP:
SELECT
  n.nutzerId            AS nutzerId,
  n.nickname            AS nickname,
  n.nutzerCode            AS nutzerCode,
  n.geschlecht            AS geschlecht,
  m.text                AS text,
  m.gesendet            AS gesendet
FROM
  nutzer                AS n,
  nachrichten            AS m
WHERE
  m.nutzerIdAn            = '".$login_nutzerId."'         AND
  m.nutzerIdVon            = n.nutzerId
ORDER BY
  m.mailId DESC
LIMIT 1

ggf. ist es schneller mit einer Unterabfrage:
PHP:
SELECT DISTINCT
  n.nutzerId            AS nutzerId,
  n.nickname            AS nickname,
  n.nutzerCode            AS nutzerCode,
  n.geschlecht            AS geschlecht,
  m.text                AS text,
  m.gesendet            AS gesendet
FROM
  nutzer                AS n,
  (SELECT *
  FROM nachrichten
  WHERE	nutzerIdAn  = '{$login_nutzerId}'
  ORDER BY mailId DESC
  LIMIT 1) AS m
WHERE
  m.nutzerIdVon            = n.nutzerId
 
schon mal danke für die antwort! mit distinct hatte ich noch nie gearbeitet, endlich lerne ich mal was dazu :)

aber ich glaube ich habe mein problem nicht ganz richtig vermittelt, es soll nicht nur eine zeile ausgegeben werden. lass mich das kurz an nem vereinfachten bsp zeigen:

tbl nuzter:
nuterId nickname
1 person1
2 person2


tbl nachrichten:
mailId nutzerId text
1 1 meine erste mail
2 2 meine erste mail
3 1 meine zweite mail


die ausgabe soll nun sein:
person1 meine zweite mail
person2 meine erste mail

also von jedem user die letzte nachricht, die er schrieb. somit würde in dieser ausgabe die zeile mailId = 1 rausfallen, da nutzer 1 danach noch eine mail schrieb.

hoffe ich konnte mich nun etwas verständlicher ausdrücken :)
 
Dazu solltest du zuerst die letzte MailID pro Nutzer ermitteln und damit die Daten zusammensammeln

PHP:
SELECT
	nutzer.nutzerCode,
	nachrichten.text
FROM
	(	SELECT
			nutzerId, 
			MAX(mailId) AS lastMailId 
		FROM 
			nachrichten
		GROUP BY 
			nutzerId
	) AS lastMailPerUser,
	nachrichten,
	nutzer
WHERE
	lastMailPerUser.nutzerId = nutzer.nutzerId
	AND lastMailPerUser.lastMailId = nachrichten.mailId
 
Zurück