Doppelte Daten nur einmal anzeigen und sortieren

ThiKool

Erfahrenes Mitglied
Hi

ich habe das Problem, dass doppelte Einträge nur einmal ausgegeben werden sollen, desshalb habe ich folgende Abfrage gebastelt:

$abfrage = "SELECT DISTINCT c_id FROM messages WHERE von ='$name' OR an='$name' ORDER BY time desc ";
$engine = mysql_query($abfrage);
while(list($c_id)=mysql_fetch_array($engine))
{
}

Das mit der Einmaligen Abfrage funktioniert, allerdings wird das Order by nicht mehr berücksichtigt.

Es sollen doppelte Daten nur einmal ausgegeben werden und das zeitlich aktuellste ganz oben erscheinen.

Habt ihr eine Tipp für mich?

Danke euch
 
Ein GROUP BY und ein MAX() auf time. Dann erst sortieren
SQL:
SELECT c_id
FROM
    (
        SELECT c_id, MAX(time) AS max_time
        FROM ...
        WHERE ...
        GROUP BY MAX(time)
    )
ORDER BY max_time DESC

PS: Der Code ist mit vorsicht zu geniessen - bin grad von dem Stadtfest+11 Bier+2grosse Ouzo+Slibowiz in unmessbrarer Grösse zurück
 
Hi

bitte Codetags verwenden.

Ich behaupte einfach einmal, dass man sich bei veralteter Software nicht erwarten soll,
dass sie problemlos mit neuer SW zusammen funktioniert.
zB. die mysql_... - Funktionen sind der alte Teil und die verwendete MySQL-Datenbank ist "zu" neu.

Und SQL-Injections sind bei dir sehr einfach.

edit: Na gut, Yaslaw war schneller, aber mein Beitrag gilt trotzdem auch.
 
Danke für euere Hilfe aber ich komm leider trotzdem nicht weiter. Es wird nichts ausgegeben!
PHP:
        $abfrage ="SELECT c_id
FROM
    (
        SELECT c_id, MAX(time) AS max_time
        FROM messages
        WHERE von ='$name' OR an='$name'
        GROUP BY MAX(time)
    )
ORDER BY max_time DESC
";



        $engine = mysql_query($abfrage);
        while(list($c_id)=mysql_fetch_array($engine))
        {
 
Ruf mal mysql_error() auf und lass dir die letzte Fehlermeldung ausgeben.

Ansonsten könntest du dir auch mal das Query ausgeben, vielleicht sind Anführungszeichen in $name das Problem.
Dieses Problem würdest du durch mysql_real_escape_string() verhindern Eine viel bessere Idee wäre aber ein Wechsel zu MySQLi oder PDO und die Nutzung von Prepared Statements!
 
Zuletzt bearbeitet:
Gut ist es auch immer den Query mal "direkt" (also ohne den Umweg über PHP) zu testen, z.B. in PhpMyAdmin.
 
Zurück