Frage zu GROUP BY
Lily
- datenbank
Hi,
ich beginn am besten von vorne:
Ich habe zwei Datenbanktabellen, die gleichzeitig ausgelesen werden müssen. Also habe ich hierfür die Funktion JOIN verwendet.
So sieht der Code aus:
$sql = "SELECT k.name, k.backupDirectory, c.timestamp FROM kunden k INNER JOIN createdbackups c ON k.id = c.customerID ORDER BY c.timestamp DESC";
So weit, wird alles korrekt mit einer while Schleife ausgegeben:
John Doe beispiel.de 2007-08-02 18:44:10
Max Mustermann cs-erweiterungen.de 2007-08-02 18:44:10
John Doe beispiel.de 2007-08-02 14:05:35
Max Mustermann cs-erweiterungen.de 2007-08-02 14:05:34
Jetzt sieht es ja ein bisschen komisch aus wenn der gleiche Name 2-Mal dasteht. Deshalb will es es nun so machen, dass gleiche Namen nun zusammengefasst werden (habe es 1 Stunde mit GROUP BY versucht, da ich glaube das es mit dem funktionieren sollte).
Da das Datum (c.timestamp) ja 4 mal vorkommt, wollte ich das immer das letzte (aktuellste) angezeigt wird.
Ich bekomme das jedoch einfach nicht hin.
Ich hoffe sehr, jemand von euch kann mir weiterhelfen. Habe das jetzt eine Stunde vergeblich versucht.
Danke!
yo,
wichtig ist es immer mit anzugeben, welches dbms und welche version du benutzt. ich vermute mal, du benutzt mysql und besonders bei der GROUP BY funktionalität geht mysql einen eigenen, in meinen augen dummen, weg. aber das ist eine andere geschichte.
Da das Datum (c.timestamp) ja 4 mal vorkommt, wollte ich das immer das letzte (aktuellste) angezeigt wird.
das eine kunde mehrmals mit angezeigt wird, liegt daran, dass zwischen den beiden tabellen eine 1:n beziehung existiert, sprich eine kunde kann mehrere createdbackups datensätze haben.
und die frage ist weniger, wie ich das technisch mit dem GROUP BY umsetzte, dass jeder kunde nur noch einmal erscheint, sondern vielmehr welche informationen du ausgeben willst. reicht mir es, den kunden anzuzeigen mit nur dem aktuellesten datumswert anzuzeigen oder anders gefragt, warum erst den join bilden, wenn ich von den vielen anderen informationen aus der tabelle createdbackups nur eines der mehreren timesstampwerte haben will.
wie auch immer, hier zwei von mehreren lösungen...
SELECT k.name, k.backupDirectory, MAX(c.timestamp)
FROM kunden k
INNER JOIN createdbackups c ON k.id = c.customerID
GROUP BY k.name, k.backupDirectory
ORDER BY 3 DESC
;
SELECT k.name, k.backupDirectory,
(SELECT (MAX(c.timestamp)
FROM createdbackups c
WHERE k.id = c.customerID
) AS Maxwert
FROM kunden k
ORDER BY 3 DESC
;
Ilja
Hi Ilja,
ersteinmal vielen vielen Dank, das du mir geholfen hast.
Ich habe mich für diese Lösung entschieden:
SELECT k.id, k.name, k.backupDirectory, MAX( c.timestamp )
FROM kunden k
INNER JOIN createdbackups c ON k.id = c.customerID
GROUP BY k.name
ORDER BY 1 ASC
Wenn ich diese obige Lösung nun in PhpMyAdmin eingebe, dann werden die Namen genau so aufgelistet, wie ich es haben will.
Nun will ich die Daten jedoch auch Ausgeben. Dies habe ich so versucht:
while ($row = mysql_fetch_assoc($result)) {
echo <<<LISTE
<div id="liste">
<table width="100%">
<tr>
<td width="20%">{$row['name']}</td>
<td width="37%">{$row['backupDirectory']}</td>
<td width="37%">{$row['timestamp']}</td>
<td width="3%"><span class="delete"><a href="customer.php?customerID={$row['id']}"><img src="enbit_backup/images/edit.png" border="0" /></a></span></td>
<td width="3%"><span class="delete"><a href="#"><img src="enbit_backup/images/delete.png" border="0" /></a></span></td>
</tr>
</a>
</table>
</div>
LISTE;
}
Es leider wird in $row['timestamp'] nicht eingefügt. Die Tabelle bleibt dort immer leer.
Habt Ihr eine Idee warum das nicht funktioniert?
Ich habe schon probiert den MYSQL Befehl so zu schreiben:
MAX( c.timestamp ) AS c.timestamp dann kam aber immer die Meldung:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\htdocs\enbit-server\list.php on line 38
Wenn ich es in PhpMyAdmin eingebe wird das angezeigt:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.timestamp FROM kunden k INNER JOIN createdbackups c ON k.id = c.customerID GROU' at line 1
Ich hoffe sehr, das mir jemand weiterhelfen kann.
Hello,
Ich habe schon probiert den MYSQL Befehl so zu schreiben:
MAX( c.timestamp ) AS c.timestamp dann kam aber immer die Meldung:
vorsicht, zwei Stolperfallen. Erstens ist "c." der Hinweis darauf, dass du eine Tabelle Referenzieren wirst. Das willst du ja gar nicht, du willst ja nur den MAX-Wert in "timestamp" umbenennen. Und da sind wir bei der zweiten Falle, "timestamp" ist ein reserviertes Wort, du musst also unbedingt Backticks verwenden.
MAX(c.timestamp) AS timestamp
MfG
Rouven