Sortierproblem in MySQL

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

  • Sortierproblem in MySQL

    Hallo,
    ich versuche eine MySQL-Abfrage in einer bestimmten Reihenfolge auszugeben. Folgender Ablauf:

    1. Mysql-Abfrage

    Ließt Datensätze aus der Datenbank aus und sortiert per RAND().
    Danach werden nur die ID´s in der Reihenfolge in einem Array gespeichert.

    Wird die Seite jetzt erneut aufgerufen frage ich mit einer neuen Abfrage nur die ID´s aus dem Array ab,
    leider sortiert er diese jetzt scheinbar willkürlich,

    PHP-Code:
    Select from ... where id=21 or id=or id=.... 
    bzw. nicht in der reihenfolge wie sie im Array stehen.
    Ich kann in der 2. Abfrage aber auch kein Sort einfügen, da dies ja auf alle Fälle eine unterschiedliche Reihenfolge zum ersten Ergebnis zur Folge hätte.

    Kann ich es jetzt irgendwie in der MySQL-Anweisung schon festlegen das ich die ID´s in der gleichen Reihenfolge, wie in der Abfrage, haben möchte?

    Muss ich das Ergebnisarray sortieren?
    Oder muss ich evtl. doch jede ID einzeln abfragen und die Ergebnisse nach den Abfragen zusammenfassen?

    Any Ideas?

  • #2
    Hm ...

    Gedankengang 1:
    PHP-Code:
    $id_ary = array(1,5,8,9,345, ...);
    $sql "SELECT * FROM table_name WHERE id IN (" implode(","$id_ary) . ""
    Gedankengang 2:
    PHP-Code:
    $id_ary = array(1,5,8,9,345, ...);
    foreach (
    $id_ary as $value) {
        
    $sql "SELECT * FROM table_name WHERE id = " . (int) $value "";
        
    // Ausgabe der Daten ...

    Sollte im Grunde genommen funktionieren.
    MM Newmedia | MeinBlog

    Kommentar


    • #3
      Hätte ich ja auch vermutet,
      dein erster Gedankengang war auch meiner,
      nur leider spuckt sql die Ergebnisse nicht in der Reihenfolge aus, wie die id´s im Array stehen.

      Kommentar


      • #4
        Den Sinn habe ich irgendwie nicht so ganz verstanden. Wieso ist die 2. ABfrage überhaupt notwendig wenn du schon in der ersten Abfrage genau die gewünschten Ergebnisse in der gewünschten Reihenfolge bekommst?

        Kommentar


        • #5
          Also, vieleicht noch etwas zum Umfeld des ganzen.

          Es geht um eine Suchfunktion, mit relativ vielen Einträgen, deswegen möchte ich die Abfragen immer so schlank wie möglich halten.

          Die ID´s der gesamten Einträge speichere ich in ein Array. Und bei den verschiedenen Seiten frage ich dann auch nur die entsprechenden id´s aus dem array ab.
          Das funktioniert ja auch alles wunderbar, bis auf das im array z.B. steht:

          8/15/4/367/12

          und ausgegeben wird in der Reihenfolge:

          15/4/12/8/367

          Kommentar


          • #6
            @Paranoia: Die IDs werden beim einem Request geholt und beim nächsten wieder verwendet. Werden gleich komplette Datensätze geholt (und z.B. in der Session abgelegt) sind diese Daten beim zweiten (u.U. viel später erfolgenden Request) nicht mehr aktuell. In der DB könnten längst andere Daten stehen.

            Zum Thema: Um in der Query eine Sortierung vorzugeben, muß man sich ziemlich verbiegen. Man braucht eine Abbildung der IDs auf eine Domäne, so dass die natürliche Ordnung der Domäne zur gewünschten Ordnung im Definitionsbereich führt. Wenn die IDs veränderlich sind, wovon ich mal ausgehe, ist so eine Funktion schwer zu finden.
            Deshalb empfehle ich die einfachste Lösung: Machs in PHP.
            Hole alle Datensätze und sortiere mit Hilfe des ID-Arrays.

            Kommentar


            • #7
              Danke das hab ich mir schon fast gedacht,
              nur wie kann ich das relativ schnell umsetzen?
              Gibt es eine arrayfunktion die beide arrays miteinander vergleicht und das 2. nach einem vorgegeben Key nach dem Muster des ersten sortiert?

              Das Problem ist ja auch:

              Im ID-Array stehen eben nur die ids,
              das später zu sortierende Array ist ein mehrdimensionales assoziatives Array.

              Kommentar


              • #8
                Also grundsätzlich würde ich eine Art Cache anlegen. Eine eindeutig zu identifizierende Textdatei, die das Array enthält. Somit ersparst Du Dir die zweite Datenbankabfrage.

                Arrays vergleichen kannst Du mit den array_diff() Funktionen.
                MM Newmedia | MeinBlog

                Kommentar


                • #9
                  @ezkimo: Du möchtest Sessions nachbauen?
                  Dann läufst du auch in das Konsistenzproblem.

                  So könnte es gehen:
                  PHP-Code:
                  $search = array();
                  $result mysql_query('SELECT * FROM t WHERE id IN('.implode(',',$ids).')');
                  while (
                  $row mysql_fetch_object($result)) {
                      
                  $search[$row->id] = $row;
                  }

                  foreach (
                  $ids as $id) {
                      
                  var_dump($search[$id]);

                  Kommentar


                  • #10
                    Perfekt !!!
                    Genial !!!

                    Ich hatte parallel dazu mir schon angefangen eine Schleifenlösung, mit Zwischenspeicherung und immer wieder vergleichen, aufzubauen, und war schon bei mehr als 100 Zeilen zusätzlicher Code ;o)

                    Vielen Dank

                    Kommentar

                    Lädt...
                    X