So erhalten Sie den neuesten Datensatz in einer nach Datum sortierten GROUP BY-Klausel in MySQL [Duplikat]MySql

MySQL DBMS-Forum
Guest
 So erhalten Sie den neuesten Datensatz in einer nach Datum sortierten GROUP BY-Klausel in MySQL [Duplikat]

Post by Guest »

Ich habe zwei Tabellen, die wie folgt definiert sind:
Eine Kleinanzeige wird von einem Benutzer erstellt und in dieser Tabelle gespeichert:

Code: Select all

CREATE TABLE `classifieds` (
`ClassifiedAdID` mediumint NOT NULL,
`CustomerID` smallint NOT NULL,
`AdTitle` varchar(128) COLLATE utf8mb4_general_ci NOT NULL,
`AdText` varchar(8192) COLLATE utf8mb4_general_ci NOT NULL,
`AdImageList` varchar(4096) COLLATE utf8mb4_general_ci NOT NULL,
`Status` varchar(32) COLLATE utf8mb4_general_ci NOT NULL,
`DateSubmitted` datetime NOT NULL,
`ExpiryDate` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Dann kann ein Administrator es mithilfe eines Formulars akzeptieren oder ablehnen, dessen Ergebnisse in dieser Tabelle gespeichert werden:

Code: Select all

CREATE TABLE `officeaction` (
`OfficeActionID` mediumint NOT NULL,
`FormContext` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`FormID` smallint NOT NULL,
`Result` varchar(64) COLLATE utf8mb4_general_ci NOT NULL,
`ActionByID` smallint NOT NULL,
`ActionBy` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`Remarks` varchar(8096) COLLATE utf8mb4_general_ci NOT NULL,
`ActionDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Beide Tabellen sind auf die jeweilige ID indiziert. Ich habe die folgende Abfrage verwendet

Code: Select all

SELECT classifieds.*, officeaction.*
FROM `classifieds`
JOIN `officeaction` ON classifieds.ClassifiedAdID = officeaction.FormID
WHERE officeaction.FormContext = 'Classifieds'
ORDER BY classifieds.ClassifiedAdID, officeaction.ActionDate DESC;
und erhalten Sie dieses Ergebnis:
Image

Wie Sie sehen können, wurde die Kleinanzeige Nr. 11 einmal abgelehnt und zweimal angenommen, und „Akzeptieren“ ist die letzte Aktion. Ich möchte also diesen Datensatz erhalten (OfficeActionID #11). Wenn ich jedoch GROUP BY (wie unten) verwende, erhalte ich den ältesten Datensatz (OfficeActionID #9), nicht den neuesten. Da ich nach Datum sortiere (DESCending), sollte ich bekommen, was ich will, aber anscheinend (laut der Dokumentation, die ich finden konnte) kann man nicht vorhersagen, welcher Datensatz angezeigt wird.
Wie kann ich eine Abfrage schreiben, die mir gibt, was ich will? Ich habe mir diese Frage und ihre Antworten angesehen (ich habe die Antworten in MySQL übersetzt), aber sie funktioniert bei mir nicht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post