Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
min(datum) Abfrage [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
min(datum) Abfrage


 
miguel_rkc
19-08-2004, 15:50 
 
Guten Tag,

ich habe ein Problem mit einer scheinbar einfachen Abfrage, die sich allerdings nach endlosem Probieren und Überlegen meinerseits doch als für mich unlösbar herausstellte.

Folgene Situation liegt vor:

Es geht um ein Meldungssystem, das jede Änderung an einer Meldung ('meldung_id') von einem User ('user_id') protokolliert (mit dem dazugehörigen Datum ('datum_akt').
Die Tabelle heisst 'user_b_meldung'.

+------------+---------+---------------------+
| meldung_id | user_id | datum_akt |
+------------+---------+---------------------+
| 1 | 1 | 2004-08-18 11:02:58 |
| 1 | 1 | 2004-08-19 13:23:07 |
| 1 | 4 | 2004-08-19 13:32:19 |
| 2 | 1 | 2004-08-18 11:03:31 |
| 2 | 1 | 2004-08-19 13:44:36 |
| 2 | 1 | 2004-08-19 13:45:10 |
| 2 | 1 | 2004-08-19 13:45:25 |
| 2 | 2 | 2004-08-18 14:22:27 |
| 3 | 1 | 2004-08-18 11:07:00 |
| 3 | 1 | 2004-08-18 13:34:19 |
| 4 | 1 | 2004-08-18 11:08:09 |
| 5 | 4 | 2004-08-18 14:25:10 |
| 5 | 4 | 2004-08-18 14:26:59 |
| 8 | 1 | 2004-08-19 13:13:51 |
| 9 | 4 | 2004-08-19 13:30:54 |
| 10 | 1 | 2004-08-19 14:47:31 |
| 10 | 2 | 2004-08-19 14:44:53 |
| 11 | 1 | 2004-08-19 15:23:59 |
| 11 | 2 | 2004-08-19 15:23:43 |
| 11 | 4 | 2004-08-19 15:24:27 |
+------------+---------+---------------------+

Nun möchte ich abfragen, wer zuerst die jeweilige Meldung geändert hat. Das Resultat müsste dann wie folgt aussehen:


+------------+---------+---------------------+
| meldung_id | user_id | datum_akt |
+------------+---------+---------------------+
| 1 | 1 | 2004-08-18 11:02:58 |
| 2 | 1 | 2004-08-18 11:03:31 |
| 3 | 1 | 2004-08-18 11:07:00 |
| 4 | 1 | 2004-08-18 11:08:09 |
| 5 | 4 | 2004-08-18 14:25:10 |
| 8 | 1 | 2004-08-19 13:13:51 |
| 9 | 4 | 2004-08-19 13:30:54 |
| 10 | 2 | 2004-08-19 14:44:53 |
| 11 | 2 | 2004-08-19 15:23:43 |
+------------+---------+---------------------+

Klingt einfach oder? Dachte ich mir auch und so habe ich diese Abfrage gebastelt (die, im Voraus bemerkt, zwar das richtige Datum liefert, aber falschen User liefert):



SELECT meldung_id,
user_id,
min(datum_akt)
FROM user_b_meldung
GROUP BY meldung_id



Sicherlich könnt ihr mir weiterhelfen.

 
mrhappiness
19-08-2004, 15:53 
 
schau dir mal http://www.php-resource.de/forum/showthread.php?s=&threadid=31056 an

alternativ müsstest du mit einer abfrage die erste änderung an einer meldung erfragen (ohne user_id) und mit einer zweiten abfrage dann denn user zu der jetzt bekannten meldung nebst bekanntem ersten datum


oder du installierst dir mysql 4.1 und nimmst ein subselect

 
miguel_rkc
19-08-2004, 16:25 
 
Denke jetzt bitte nicht, dass ich zu faul bin meine Birne selber anzustrengen, allerdings bringt mich dein Verweis nicht weiter, da ich ja keine Joins benutze. MySQL 4.1 habe ich übrigens installiert, jedoch fällt mir keine sinnvolle Möglichkeit ein, SubQuerys an dieser Stelle zu nutzen.

Ich hab übrigens die Abfrage ein wenig modifiziert und sie liefert auch die richtigen Werte, jedoch vernachlässigt er genau 2 Zeilen in der Lösungsmenge, nämlich meldung_id 10 & 11... warum? Keine Ahnung.


SELECT user_id, meldung_id, datum_akt
FROM user_b_meldung
GROUP BY meldung_id
HAVING datum_akt = min(datum_akt)

 
wahsaga
19-08-2004, 16:36 
 
Original geschrieben von miguel_rkc
allerdings bringt mich dein Verweis nicht weiter, da ich ja keine Joins benutze.
"oh, sie haben sich ein bein gebrochen, soll ich ihnen einen krankenwagen rufen?"

- "nein, ein krankenwagen bringt mich nicht weiter, weil ich keinen führerschein habe ..."


(vielleicht solltest du es mal mit joins versuchen, weil es damit am besten geht ...?)

 
miguel_rkc
20-08-2004, 00:12 
 
Du hättest mir gleich dazu schreiben sollen, wie ich in einer Tabelle Joins anwende... ich bin gespannt :)

Naja, ich werd mich morgen nochmal auf Arbeit ransetzen, jedoch bin ich weiterhin für konstruktive Hilfe offen.

mfg & n8

 
asp2php
20-08-2004, 08:20 
 
Original geschrieben von miguel_rkc
Du hättest mir gleich dazu schreiben sollen, wie ich in einer Tabelle Joins anwende... ich bin gespannt :)

nicht unbedingt was zur Lösung deines Problem, aber zur Klärung deiner Frage, du unwissende ;):
http://www.php-resource.de/forum/showthread.php?s=&postid=279854#post279854

 
miguel_rkc
20-08-2004, 09:12 
 
Ok, wieder etwas dazu gelernt - was mir aber leider auch nicht weiterhilft :(

 
mrhappiness
20-08-2004, 09:13 
 
sollte es aber, wie sieht denn deine neu dazugelernte abfrage aus?

 
miguel_rkc
20-08-2004, 10:47 
 
So, it's done.


SELECT u.meldung_id,
u.user_id,
u.datum_akt
FROM user_b_meldung AS u
LEFT JOIN user_b_meldung AS u2 ON
u.meldung_id = u2.meldung_id
AND u.datum_akt > u2.datum_akt
WHERE u2.meldung_id IS NULL


Die Abfrage entzieht sich zwar meiner Meinung nach jeglicher simpler Logik, aber sie funktioniert - danke für den Verweis.

 
mrhappiness
20-08-2004, 10:49 
 
wenn du nicht viele einträge in der tabelle hast, dann nimm das WHERE mal raus und lass dir u2 noch ausgeben
SELECT
u.meldung_id, u.user_id, u.datum_akt,
u2.meldung_id, u2.user_id, u2.datum_akt
FROM user_b_meldung AS u
LEFT JOIN user_b_meldung AS u2 ON
u.meldung_id = u2.meldung_id AND
u.datum_akt > u2.datum_aktdas sollte beim verständnis helfen :)

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:53 Uhr.