Update mit den jeweils letzten Werten einer anderen Tabelle

Matthias Becker

Grünschnabel
mySQL 5: Update mit den jeweils letzten Werten einer anderen Tabelle

Hallo zusammen,

war gar nicht so einfach den Titel zu benennen und ehrlich gesagt bin ich immer noch nicht zufrieden damit :D

Ich möchte die Datensätze einer Tabelle mit den Daten einer anderen Tabelle updaten. Schwierigkeit (für mich) liegt dabei, dass es jeweils die letzten Datensätze einer bestimmten ID sein sollen:

Der Inhalt der ersten Tabelle node_comment_statistics:

| nid | last_comment_timestamp | last_comment_uid |
|------+------------------------+------------------|
| 1117 | 1283527141 | 2205 |
| 1118 | 1283527098 | 1205 |



die zweite Tabelle comments:

| cid | nid | uid | timestamp |
|-----+------+------+------------|
| 1 | 1118 | 1205 | 1283527098 |
| 2 | 1117 | 2205 | 1283527141 |
| 3 | 1118 | 1214 | 1283527210 |
| 4 | 1118 | 4711 | 1283527230 |
| 5 | 1117 | 1815 | 1283527277 |

In diesem Beispiel sollte die abzuändernde Tabelle nod_comment_statistics eigentlich so aussehen:

| nid | last_comment_timestamp | last_comment_uid |
|------+------------------------+------------------|
| 1117 | 1283527277 | 1815 |
| 1118 | 1283527230 | 4711 |


Meine folgende Abfrage dated aber leider nur die erste Zeile (nid: 1117) ab:

Code:
UPDATE node_comment_statistics AS n,
(
SELECT comments.cid, comments.nid, comments.uid, comments.timestamp
FROM comments, node_comment_statistics
WHERE comments.nid=node_comment_statistics.nid
ORDER BY cid DESC LIMIT 1
) AS c
SET n.last_comment_timestamp=c.timestamp,
n.last_comment_uid=c.uid
WHERE n.nid=c.nid

Kann mir jemand weiterhelfen?

Viele Grüße

Matthias
 
Zuletzt bearbeitet:
MySQL?
Könnte etwa so gehen
SQL:
UPDATE node_comment_statistics AS n
SET n.last_comment_uid = (
	SELECT
		c.uid
	FROM 
		comments AS c
	WHERE 
		ROW(c.mid, c.tuimestamp) IN (
			SELECT
				cmax.nid,
				MAX(cmax.timestamp) AS lastTimestamp
			FROM comments AS cmax
			WHERE cmax.nid = n.nid
			GROUP BY cmax.nid
		)
);
 
Zuletzt bearbeitet von einem Moderator:
Zurück