[MySQL] Suche richtigen SELECT-Befehl zu Problem

MAN

Erfahrenes Mitglied
Hallo,

ich brauche an sich einen ganz einfacher SELECT-Befehl zu meinem Problem, aber leider komme ich einfach selbst nicht drauf :(

Vorliegend habe ich folgende Tabelle `tb_test` mit folgenden Attributen und Daten:

Code:
id  postid  userid   datetime
 1     9       5     1125668925
 2     5       2     1125669260
 3     2       5     1125669569
 4     8       4     1125672405
 5     7       3     1125672464
 6     4       4     1125672477
 8     2       2     1125679569
 9     5       4     1125682405
12     6       6     1125682464
13     4       2     1125682477
16     2       3     1125689569
17     1       2     1125692405
18     2       1     1125692464
19     2       2     1125692477
Hier raus will ich jetzt die letzten 5 id's ('id') rausholen, die mit einer postid zuletzt (datetime) eingefügt wurde.

Nach dem Beispiel bräuchte ich also folgende Ausgabe:

Code:
id
19
17
13
12
 9
Also immer die 'id' des zuletzt eingefügten datensatz, bei der die postid nicht doppelt vorkommt (ihr wisst ja gar nicht, wie schwer das ist zu erklären :( )

Aber ich hoffe ihr könnt mir trotzdem helfen bzw. mal einen Denkanstoß geben!

Besten Dank!

mfG,
MAN
 
Hm nicht so wirklich verstanden.

Du willst nach datetime geordnet die letzten 5 Einträgen, oder so?
Warum darf dann in der Ausgabe nicht 18 erscheinen?

Aufjednefall guck dir mal ORDER BY an, dann wirst du das wahrscheinlich auch selbst hinkriegen, wie du das willst.
 
Letztendlich ist es nach 'datetime' (bzw. 'id') absteigend sortiert, das ist richtig, aber dabei darf eben kein doppel der postid vorkommen. Und die normale 'id' 18 hat denzufolge das zweite Mal die 'postid' von 2.

Wie gesagt, echt kompliziert es zu erklären, aber für mich noch komplizierter eine Lösung zu finden :-(
 
Ich weiß nicht, wie man eine id nur einfach Auslesen kann.
Mir fällt dazu nur ein:
PHP:
<?php
function delete_multiple_id ($i) {
   global $daten;
   if ($i => count($daten)-1) {
      return true;
   } 
   else {
      if ($daten[$i] == $daten[$i++]) {
         unset($daten[$i]);
      }
      delete_multiple_id ($i++);
   }
}
$sql = "SELECT `id`
            FROM  `tb_test`";
$result = mysql_query($sql) or die (mysql_error());
$i = 0;
while ($row = mysql_fetch_assoc($result)) {
   $daten[$i] = $row['id']; 
   $i++;
}
asort($daten, SORT_NUMERIC);
delete_multiple_id (1);
?>
$daten müsste am Schluss alle id's enthalten, die von hinten angefangen nicht doppelt sind. Also die , die von oben als 1. kommen, werden gelöscht.

IST UNGETESTET - Grad so hingezaubert ;) Vielleicht klappts aber.

Edit: Ist zwar umständlich, aber ich kenne keine Alternativ-Lösung. Wenn jemand eine Funktion zum Doppeltem-Index-Löschen kennt immer her damit ;)
Wenn's am Anfang nicht klappt, gib ersteinmal print_r($daten); am Schluss des Scriptes aus.
Vielleicht klappt unset($array[x]) nicht, hab das bis jetzt immer nur auf Arrays, nicht auf Indizes angewendet.
 
Zuletzt bearbeitet:
Besten Dank, dass du dir die Mühe machst und mir so viel PHP-Code schreibst.

Doch leider kann es so nicht gehen, wenn du nicht mal die postid aus der Datenbank ausliest, denn die ist ja wichtig um das Ergebnis zu bekommen :(

Denn er soll mir ja alle id's rausgeben, bei denen die postid noch nicht vorgekommen ist.

Ich will es mal nochmal an einem vielleicht einfacheren Beispiel erklären (hat ja im grundegenommen weniger mit datetime und der userid zu tun...:

Code:
   id    postid
=>  9      5
=>  8      2
=>  7      3
    6      3    <= nicht nehmen, da postid 3 schon in der Menge vorhanden
=>  5      4
    4      2    <= nicht nehmen, da postid 2 schon in der Menge vorhanden
=>  3      8
    2      2    <= ab hier keine weiteren, da nun 5 id's in der Ergebnismenge sind.
    1      5

Sprich, er gibt mir dann die folgenden id's aus: 9, 8, 7, 5, 3 (keine postid's)

Vielleicht konnte ich es nun im 3. Anlauf etwas näher erklären!
 
MAN hat gesagt.:
Besten Dank, dass du dir die Mühe machst und mir so viel PHP-Code schreibst.

Doch leider kann es so nicht gehen, wenn du nicht mal die postid aus der Datenbank ausliest, denn die ist ja wichtig um das Ergebnis zu bekommen :(

Denn er soll mir ja alle id's rausgeben, bei denen die postid noch nicht vorgekommen ist.

Ich will es mal nochmal an einem vielleicht einfacheren Beispiel erklären (hat ja im grundegenommen weniger mit datetime und der userid zu tun...:

Code:
   id    postid
=>  9      5
=>  8      2
=>  7      3
    6      3    <= nicht nehmen, da postid 3 schon in der Menge vorhanden
=>  5      4
    4      2    <= nicht nehmen, da postid 2 schon in der Menge vorhanden
=>  3      8
    2      2    <= ab hier keine weiteren, da nun 5 id's in der Ergebnismenge sind.
    1      5

Sprich, er gibt mir dann die folgenden id's aus: 9, 8, 7, 5, 3 (keine postid's)

Vielleicht konnte ich es nun im 3. Anlauf etwas näher erklären!

Nein, an dir liegts nicht.
Ich hatte es schon verstanden, nur dann irgendwie doch wieder alles falsch gemacht.
Mal sehn, was ich jetzt für dich herzaubern kann :D
 
PHP:
<?php
function delete_multiple_id ($i) {
   global $daten;
   if ($i => count($daten)-1) {
      return true;
   }
   else {
      for ($y = 0; $y <= count($daten)-1; $y++) {
      if ($daten[$i]['postid'] == $daten[$y]['postid']) {
         unset($daten[$i]);
         break;
      }
      delete_multiple_id ($i++);
   }
}
$sql = "SELECT `id, `postid`
            FROM  `tb_test`";
$result = mysql_query($sql) or die (mysql_error());
$i = 0;
while ($row = mysql_fetch_assoc($result)) {
   $daten[$i] = array(id => $row['id']);
   $daten[$i] = array(postid => $row['postid']);
   $i++;
}
for ($i = 0, $i <= mysql_num_rows($result); $i++) {
   array_multisort($daten[$i], SORT_ASC, SORT_NUMERIC);
}
delete_multiple_id (0);
?>

Musste den Code nur minimal ändern. Hoffe, dass es so geht.
Ich schau ihn mir grad nocheinmal in Ruhe an, also vielleicht wird der nocheinmal editiert ;)

edit: warte mal noch nicht ausprobieren muss was nachgucken ;)
edit2: Jetzt kannst du's mal probieren. Wenn ein Fehler drinnen ist, sag mir bescheid, kann sehr gut sein ;)
 
Zuletzt bearbeitet:
Je nachdem wie du die Daten weiter verarbeiten willst, kannst du es (wie schon irgendjemand gesagt hat ;) ) mit GROUP BY machen:
HTML:
    SELECT id, MAX(id), postid,datetime, MAX(datetime)
    FROM  `tb_test` 
    GROUP BY postid
    ORDER  BY datetime desc
    LIMIT 0 , 5

Vielleicht probierst du einfach mal diesen Select aus, und schaust dir das Ergebnis an.

Edit: Vergiss was ich noch gechrieben habe... sorry, ist spät ;)
 
Zuletzt bearbeitet:
Joah..... so weit bin ich auch schon gekommen :D aber dann.... irgendwie gibt es kein wirklichen SELECT-Befehl für mein Problem :(

Möglich wäre es sicherlich mit Sub-Selects, aber leider werden die ja bei MySQL nicht unterstützt.... warum eigentlich nicht :-(

Naja, bin grad noch dabei den Workaround von "Irgendjemand_1" auszuprobieren, ich hoffe es funktioniert so ;)
 
Naja ich bin mir fast sicher, dass einige kleinere Fehler sich eingeschlichen haben, außer der vergessenen Klammer, die ich aber schon per PN erwähnt habe.
Müssen nicht unbediengt Syntax-Error sein - Von denen mache ich relativ wenige, ich mach das ja jetzt schon ne Weile und hab einen Blick dafür.

Aber irgendwelche Fehler sind da 100% noch drinnen :D Nie zu optimistisch sein.

Wenn du's heute (also heute nacht) nicht hinkriegst, check ich den Code morgen noch mal und optimier ihn auch noch etwas, damit alles insgesammt (wenn auch nicht viel) schneller läuft.

edit: array_multisort hätte ich ja gar nicht gebraucht, wenn ich ORDER BY benutzt hätte, oder?
 
Zuletzt bearbeitet:
Zurück