MySQL Abfrage GROUP BY mit dem neusten Eintrag

webdoktor

Angesehenes Mitglied
Hallo zusammen

Ich habe einige Einträge in einer DB und möchte nun ein GROUP BY machen.
Das funktioniert alles gut aber leider zeigt es mir bei der Gruppierung dann immer den ältesten Eintrag an und nicht den neusten.
Leider geht dann am Ende das ORDER BY nicht. Ich weiss, dass man es irgendwie anders machen muss aber hab es noch nicht geschafft.

Also ich habe es erfolglos so versucht:
$abfrage_nachrichten = "SELECT * FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender' ORDER BY id DESC ";


Und auch so:
$abfrage_nachrichten = "select id_benutzer_sender, MAX(id), nachricht, zeit_send from nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender' ORDER BY zeit_send DESC";

Wer kann mir helfen bei der richtigen Abfrage?
Freue mich auf eure Hilfe und Danke schon im Voraus.

Marco
 
Dein SQL kann m.E. gar nicht funktionieren (keine Ahnung, was MySQL da macht), denn ein SELECT * und ein GROUP BY schließen sich aus. GROUP BY ist schließlich eine Gruppierung, mit der eine Summierung, Zählung etc. vorgenommen wird und das fehlt in Deinem ersten SQL einfach und in deinem zweiten SQL werden nachricht und zeitsend nicht in die Gruppierung eingeschlossen. Der MS SQL Server bspw. würde diesen SQL gar nicht erst akzeptieren, sondern - m.E. berechtigterweise - einen Fehler ausgeben. Ich finde es seltsam, dass MySQL das überhaupt zulässt.

Wenn ich Deinen SQL richtig interpretiere, willst Du zu einem bestimmten Empfänger eine Liste erstellen, in der zu jedem Sender die jeweils letzte (neueste) E-Mail ermittelt wird. Wenn Spalte ID die ID der nachrichten ist und fortlaufend hochgezählt wird, so dass höhere ID gleichbedeutend mit "neuer" ist, dann könntest Du es so mit einem sub-select versuchen:

SELECT id_benutzer_sender, nachricht, zeit_send FROM nachrichten INNER JOIN
(SELECT MAX(id) AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender') LastMsg
ON Nachrichten.Id=LastMsg.LastID




HTH
Alex
 
QUOTE (webdoktor @ Di 6.03.2012, 22:06)Hallo zusammen

Ich habe einige Einträge in einer DB und möchte nun ein GROUP BY machen.
Das funktioniert alles gut aber leider zeigt es mir bei der Gruppierung dann immer den ältesten Eintrag an und nicht den neusten.
Leider geht dann am Ende das ORDER BY nicht. Ich weiss, dass man es irgendwie anders machen muss aber hab es noch nicht geschafft.

Also ich habe es erfolglos so versucht:
$abfrage_nachrichten = "SELECT * FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender' ORDER BY id DESC ";


Und auch so:
$abfrage_nachrichten = "select id_benutzer_sender, MAX(id), nachricht, zeit_send from nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender' ORDER BY zeit_send DESC";

Wer kann mir helfen bei der richtigen Abfrage?
Freue mich auf eure Hilfe und Danke schon im Voraus.

Marco

was Du bräuchtest, wäre ein

SELECT
ORDER BY
GROUP BY


um die "Suchreihenfolge" zu sortieren"
(also, mit welchem Datensatz wird eine "Gruppe" in die Ergebnisse aufgenommen)
sql verlangt aber


SELECT
GROUP BY
ORDER BY

= groupieren und dann "Ergebnisse"Sortieren


QUOTE (alexr @ Mi 7.03.2012, 08:49)Dein SQL kann m.E. gar nicht funktionieren (keine Ahnung, was MySQL da macht), denn ein SELECT * und ein GROUP BY schließen sich aus.
GROUP BY ist schließlich eine Gruppierung, mit der eine Summierung, Zählung etc. vorgenommen wird

Der MS SQL Server bspw. würde diesen SQL gar nicht erst akzeptieren, sondern - m.E. berechtigterweise - einen Fehler ausgeben. Ich finde es seltsam, dass MySQL das überhaupt zulässt.

SELECT * FROM csvASucheA

QUOTE
ts: 1330939658
shopid: 885
fct: 23
fcd1: 0
fcd2: 43
fcc: 5
keyword: abenteuer
fin_titel:
fin_desc1:
fin_desc2:



SELECT COUNT(keyword)AS c FROM csvASucheA

QUOTE c: 24523



SELECT keyword FROM csvASucheA

QUOTE
keyword: a
keyword: a
keyword: aa
keyword: aa




SELECT keyword FROM csvASucheA
GROUP BY keyword

QUOTE
keyword: a
keyword: aa
keyword: aaa


11325 Datensätze von 24523


SELECT keyword FROM csvASucheA
GROUP BY keyword
ORDER BY keyword DESC

QUOTE
keyword: aße
keyword: azzurro
keyword: azzurak



SELECT keyword FROM csvASucheA
ORDER BY keyword DESC
GROUP BY keyword

QUOTE You have an error in your SQL syntax;





QUOTE (alexr @ Mi 7.03.2012, 08:49)Der MS SQL Server bspw. würde diesen SQL gar nicht erst akzeptieren,

wofür steht MS nochmal? MegaShit?

wenn "MS SQL" das nicht kann(macht)
dann kann MS kein SQL
http://de.wikipedia.org/wiki/SQL
aber MS ist ja bekannt dafür Murks zu machen
z.B. RTF ein Textaustauschformat das MS erfunden hat
MS hat dafür ne fette Doku geschrieben
MS-Office Programmierer haben die aber nicht gelsen
= MS-Office war inkompatibel zum Firmenintern erfundenen Firmenübergreifenden Austauschformat
 
QUOTE (webdoktor @ Di 6.03.2012, 22:06) Wer kann mir helfen bei der richtigen Abfrage?


nachdem ich mein gesüze abgeschickt habe (hatte dein Problem auch schonmal)


eine Möglichkeit
ein "Flagfeld"(ich nehm dazu "int" wo ich einfach via wert ein Bit setze)


bei einem Insert
* UPDATE .... SET neuster=0 WHERE
* INSERT .... SET neuster=1

dann in deinem SELECT
kein GROUP
sondern beim WHERE .... neuster=1
 
Hallo zusammen

Zuerst mal vielen Dank für eure Bemühungen.

@alexr: Du hast es richtig verstanden ich will immer nur die letzte (neuste) Nachricht von den Sendern resp Empfänger.
Ich werde Deine Abfrage am Abend gleich mal ausprobieren. Wäre mega wenn das klappt!

@800XE: Muss mir Deine Antworten am Abend auch mal genau durchlesen. Beim drüberfliegen verstand ich das ganze
noch nicht so genau. Werde mir aber am Abend dafür Zeit nehmen.

LG Marco
 
Hallo alexr

Ich habe es mit Deiner Abfrage versucht. Leider zeigt es mir so gar keine Einträge resp. Nachrichten mehr an obwohl ich Nachrichten von verschiedenen Benutzern erhalten habe. Hmm?! Hast Du eine Idee wieso?


Vielen Dank für Deine Bemühungen.
Marco
 
Ohne die Datenbank bzw. Tabellen zu kennen, ist es natürlich für mich schwer, den Fehler zu finden. Der SQL müsste korrekt sein.

Ergibt denn die Unterabfrage (SELECT MAX(id) AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender' ) irgendwelche Daten?

(Ist die Spalte ID in Tabelle Nachrichten überhaupt ein numerischer Wert, der hochgezählt wird? Falls ja, was ist dann die id, die in $_SESSION[id] steht? Ich nehme an, $_SESSION[id] wird durch PHP automatisch durch den Empfänger ersetzt?
Wozu Du geloescht_empfaenger = 0 brauchst, habe ich nicht verstanden, daher hatte ich es einfach übernommen.)


Was Du noch versuchen kannst, ist ein Unter-SELECT. Dies ist normalerweise aber kein guter Weg, da er - abhängig von der Datenmenge - sehr langsam ist.

SELECT id_benutzer_sender
, (SELECT TOP 1 nachricht FROM nachrichten where id_benutzer_sender=N.id_benutzer_sender AND id_benutzer_empfaenger = '$_SESSION[id]' ORDER BY zeit_send desc) AS Nachrichttext
, (SELECT Max(zeit_send) FROM nachrichten where id_benutzer_sender =N.id_benutzer_sender AND id_benutzer_empfaenger = '$_SESSION[id]') AS Zeit
FROM nachrichten AS N
WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0

Oder:

SELECT * FROM nachrichten
WHERE ID=(SELECT MAX(ID) FROM nachrichten WHERE id_benutzer_sender=N.id_benutzer_sender AND id_benutzer_empfaenger = '$_SESSION[id])
FROM nachrichten AS N
WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0



HTH
Alex
 
Hallo Alexr

Danke für Deine Bemühungen. Ist mega lieb dass Du Dir die Zeit nimst.

Also die Abfrage ergibt nur eine Eintrag aber ohne nachricht usw:
SELECT MAX(id) AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender'

Nun $_SESSION[id] wird gesetzt wenn sich der User angemeldet hat. Das ist also die id vom Benutzer.
geloescht_empfaenger = 0 bedeutet, dass der Empfänger die Nachricht noch nicht gelöscht hat. Wenn der Empfänger die
Nachricht löscht, dann wird es auf 1 gesetzt. Es kann ja auch sein, dass der Sender die nachricht löscht dann wäre das geloescht_sender = 1.


Ich verstehe das natürlich, dass es sehr kompliziert ist ohne DB. Darum schreibe ich Dir doch am besten kurz die DB
auf und erkläre dir nochmals genau was ich meine - OK?

Die id (kleine geschrieben) ist ein Wert der sich automatisch erhöht pro Nachricht wird diese immer um 1 erhöht.
Sag mir doch kurz, was genau Du von mir brauchst damit es am einfachsten ist für Dich?

Marco
 
Hallo Marco,

naja, eine komplette Analyse möchte ich jetzt hier in meiner Freizeit nicht vornehmen. Dazu müsste ich schon die ganze Datenbank haben, damit ich es mit richtigen Daten testen kann, sonst ist es ab einem bestimmten Punkt nur Rumgestocher.

QUOTE (webdoktor @ Mi 7.03.2012, 14:46)
Also die Abfrage ergibt nur eine Eintrag aber ohne nachricht usw:
SELECT MAX(id) AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender'




Hast Du geprüft, ob es hier wirklich mehr Datensätze gibt, in dem Du statt max(id) z.B. nur id_benutzer_sender, id verwendest?



Alex
 
Hallo Alex

Danke für Deine Antwort.
Nun auch das gibt bei mir nur einen Eintrag:

$abfrage_nachrichten = "SELECT id_benutzer_sender, id AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender'";

Sehr komisch weil das hier gibt bei mir verschiedene Einträge von verschiedenen Benutzern:
$abfrage_nachrichten = "SELECT * FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 ORDER BY id DESC ";

Hmm? Weiss nicht wo ich ansetzen muss...

LG Marco
 
QUOTE (webdoktor @ Mi 7.03.2012, 16:29)Hallo Alex

$abfrage_nachrichten = "SELECT id_benutzer_sender, id AS LastID FROM nachrichten WHERE id_benutzer_empfaenger = '$_SESSION[id]' AND geloescht_empfaenger = 0 GROUP BY 'id_benutzer_sender'";

LG Marco


Hier hast Du ja wieder ein GROUP BY drin ohne ein SUM, MAX o.ä. So eine Abfrage kann m.E. gar kein "richtiges" Ergebnis produzieren. Also entweder mit MAX(id) und GROUP BY oder mit einzelnen Spalten ohne MAX(id), dann aber auch ohne GROUP BY.

Ich schätze, ich kann Dir jetzt auch keinen Tipp mehr geben.

Alex



 
Zurück
Oben