SQL / Array schneller sortieren?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL / Array schneller sortieren?

    Hallo,

    zunächst einmal: ich bin natürlich verrückt
    weil ich selber ein PHP-Forum programmiert habe.
    (gibt ja erst 2500 davon)
    Ok, aber nun ist es soweit fertig, nur manchmal etwas
    langsam, wenn sehr viele Threads zu sortieren sind.
    Nun die Frage: Kann man unterstehende Routine
    verbessern/optimieren?

    Beschreibung:
    zuerst wird das ergebnis ($result) datensatzweise in ein array $arr_topics kopiert. Dann wird gesucht, ob es zu den threads Antworten neueren datums gibt.
    Es soll so sortiert werden: "1. Einträge mit Wert STICKED" Danach alle Datensätze nach Datum des Posts ODER neuem Datum einer Antwort.
    Wahrscheinlich kann/will sich da aber keiner reindenken.
    Wie gesagt, unten stehender Auszug funktioniert, ist nur ziemlich langsam wegen der vielen queries.


    ..... ($result ist eine erste MySQL-Abfrage mit allen Sätzen)
    ......
    $num_topics=0;

    // Here begins main output loop

    while ($arr = mysql_fetch_array($result))
    {
    $arr_topics[]=$arr;
    $num_topics++;
    }
    for ( $i=0 ; $i < $num_topics ; $i++)
    {
    $id=$arr_topics[$i]["id"];
    $sqlx="SELECT date,replyid,id FROM $table WHERE replyid='$id' ORDER BY date DESC";
    $resx=mysql_query($sqlx);
    if ($resx)
    {
    $rowx=mysql_fetch_row($resx);
    $rdate=$rowx[0];
    if ($rdate) $arr_topics[$i]["newdate"]=$rdate;
    else $arr_topics[$i]["newdate"]=$arr_topics[$i]["date"];
    }
    }

    // usort($arr_topics,"sticked");

    // sort order
    // 1. sticked - date
    // 2. newest posts (parent=Y) - date
    // 3. older posts with new replies (parent=N) - date
    // 4. rest - date
    // Array [id, replyid, date, sticked]


    reset($arr_topics);
    usort ($arr_topics, "cmp");
    reset($arr_topics);

    function cmp($a, $b)
    {
    if ($a['sticked'] == 'Y') return -1;
    if ($b['sticked'] == 'Y') return 1;
    if ($a['newdate'] == $b['newdate']) return 0; //same
    return ($a['newdate'] < $b['newdate'])?1:-1; // only by date
    }

    -------
    Ideen wie ich das besser machen kann?
    Gruss,
    Stefan

  • #2
    geht es jetzt bei dir um das sortieren der Threads?

    Das hab ich bei mir anders gelößt, da wird bei jedem Post ein timestamp in die tabelle "threads" geschreiben.
    und nachher lass ich mir die threads danach sortiert wieder ausgeben.
    Die Musikreview Seite

    hi, i'm a signature virus. copy me into your signature to help me spread.

    Kommentar


    • #3
      Nun, offensichtlich benötigst du für jeden Thread eine Query, was natürlich unvertretbar ist.

      Besser wäre es mittels JOIN / LEFT JOIN alle Daten eines Thread gleich mit der ersten Query auszulesen.

      -> http://www.mysql.com/documentation/m...ntax.html#JOIN

      Kommentar


      • #4
        oder eben hier.
        http://www.php-resource.de/forum/sho...threadid=28292
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar

        Lädt...
        X