web_wolf: Datenbank-Abfrage sortieren ?!

Hallo,

Ich habe in einem anderen Thema schon ein derartigen Problem kämpfen müssen. Dort ging es am Ende allerdings um die Funktion usort();, mit der man ein Array anhand seiner Einträge sortieren kann. Leider hat mir das nicht ganz weiter geholfen und schein auf diesem Weg auch schon ziemlich kompliziert zu sein.
Folgendes Array ist gegeben:

array(3) {  
  [0]=>  
  string(1) "7"  
  [1]=>  
  string(1) "3"  
  [2]=>  
  string(1) "4"  
}

Hierbei handelt es sich um Benutzer-IDs.
Aus einer anderen Tabelle sollen jetzt anhand dieser IDs die Benutzer-Informationen der Benutzer gelesen werden und in ein weiteres Array gesetzt werden. Und zwar in der gleichen Reihenfolge wie im ersten Array (7,3,4).

  
$SQL=  
 "SELECT  
   *  
 FROM  
   userinfos  
 WHERE  
   (id = '7'  
   OR id = '3'  
   OR id = '4')";  
  
$users = array();  
$count = 0;  
$result = mysql_query($sql) OR die(mysql_error());  
while($entry = mysql_fetch_assoc($result)) {  
   $members[$count] = array();  
   array_push($users[$count],$entry['id']);  
   array_push($users[$count],$entry['name']);  
   array_push($users[$count],$entry['type']);  
   array_push($users[$count],$entry['wohnort']);  
   array_push($users[$count],$entry['status']);  
   $count++;  
}  

Wird dies Ausgegeben, sieht das in etwa so aus:

array(3) {  
  [0]=>  
  array(5) {  
    [0]=>  
    string(1) "3"  
    [1]=>  
    string(12) "Rolf"  
    [2]=>  
    string(6) "1"  
    [3]=>  
    string(2) "26314"  
    [4]=>  
    string(1) "0"  
  }  
  [1]=>  
  array(5) {  
    [0]=>  
    string(1) "4"  
    [1]=>  
    string(9) "Dieter"  
    [2]=>  
    string(6) "1"  
    [3]=>  
    string(2) "26414"  
    [4]=>  
    string(1) "1"  
  }  
  [2]=>  
  array(5) {  
    [0]=>  
    string(1) "7"  
    [1]=>  
    string(15) "Peter"  
    [2]=>  
    string(6) "1"  
    [3]=>  
    string(2) "26345"  
    [4]=>  
    string(1) "0"  
  }  
}

Diesen Query habe ich nun genutzt, um die Benutzer-Informationen aus der Tabelle auszulesen. Leider jedoch ist das neue Array wieder nach den IDs geordnet (3,4,7 - ASC) und nicht so, wie ich es haben wollte (7,3,4).

Gut Ding mag weile haben, aber ich sitz jetzt schon fast 1 Woche an einer einzigen Funktion fest ^^

Hat jemand vielleicht eine Idee, wie sich mein Vorhaben realisieren lässt?
Vielen Dank im Vorraus .

  1. Hi

    Hm. Bloede Frage: Warum liest Du deine Daten nicht direkt aus der Datenbank, statt sie mit php zusammenzuflicken? Dafuer sind Datanbanken schliesslich da.

    Ich frag nur, weil Du sicher einen Grund dafuer hast, statt einfach die offensichtlichste Loesung zu benutzen.

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. Hi

      Hm. Bloede Frage: Warum liest Du deine Daten nicht direkt aus der Datenbank, statt sie mit php zusammenzuflicken? Dafuer sind Datanbanken schliesslich da.

      Ich frag nur, weil Du sicher einen Grund dafuer hast, statt einfach die offensichtlichste Loesung zu benutzen.

      Hallo,

      Leider weiß ich nicht genau, was du damit meinst, denn ich habe das Aulesen von Datebanken genauso gelern (http://tut.php-q.net/).

      Ich weiß, dass ich die Daten aus der Datenbank direkt mit echo oder print ausgeben kann, ich brauche die ausgelesenen Daten aber mehrmals auf der Seite.

      Wäre nett, wenn du da weiter drauf eingehen könntenst. Verbesserungsvorschläge nehm ich gerne an =)

      1. Heyho!

        Leider weiß ich nicht genau, was du damit meinst, denn ich habe das Aulesen von Datebanken genauso gelern (http://tut.php-q.net/).

        Waere ein(e) SQL Tutorial/Doku nicht sinvoll gewesen?

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
        1. Heyho!

          Leider weiß ich nicht genau, was du damit meinst, denn ich habe das Aulesen von Datebanken genauso gelern (http://tut.php-q.net/).

          Waere ein(e) SQL Tutorial/Doku nicht sinvoll gewesen?

          Wenn du mich schon so fragst: Wahrscheinlich schon.

          1. Mooin!

            Waere ein(e) SQL Tutorial/Doku nicht sinvoll gewesen?

            Wenn du mich schon so fragst: Wahrscheinlich schon.

            Es is warm hier im Buero und ich hab jetzt endlich Feierabend! Die vergessenen Links hab ich mittlerweile ja gepostet. Mit denen von Vinzenz hat man eigentlich n brauchbares Arsenal an Infos. Viel Spass beim Stoebern. Ueber die Suchmaschine Deiner Wahl findest Du sicher auch deutsche Dokus, falls noetig.

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
            1. Hallo Steel,

              Es is warm hier im Buero und ich hab jetzt endlich Feierabend! Die vergessenen Links hab ich mittlerweile ja gepostet. Mit denen von Vinzenz hat man eigentlich n brauchbares Arsenal an Infos. Viel Spass beim Stoebern. Ueber die Suchmaschine Deiner Wahl findest Du sicher auch deutsche Dokus, falls noetig.

              ich dachte, Rouven und ich hätten unsere Artikel in deutscher Sprache verfasst. Sollte ich mich geirrt haben - oder ist es in Deinem Büro einfach zu warm? ;-)

              Freundliche Grüße

              Vinzenz

              1. Hallo Vinzenz,

                Ueber die Suchmaschine Deiner Wahl findest Du sicher auch deutsche Dokus, falls noetig.
                ich dachte, Rouven und ich hätten unsere Artikel in deutscher Sprache verfasst. Sollte ich mich geirrt haben - oder ist es in Deinem Büro einfach zu warm? ;-)

                es besteht ein IMO gravierender Unterschied zwischen einer Doku und einem gut geschriebenen Tutorial: Ein Tutorial sollte so einfach und anschaulich sein, dass ein Neuling damit in die Materie eintauchen kann; eine Doku oder Referenz muss dagegen in die Tiefe gehen, so dass sie auch Detailprobleme fortgeschrittener Anwender bedienen kann.

                Und damit möchte ich weder das eine noch das andere abwerten; beide haben ihre Berechtigung, meist in unterschiedlichen Stadien des Lern- und Arbeitsprozesses.

                Nichtsdestotrotz suche ich sowohl das eine wie das andere eher in Englisch als in Deutsch. Aber das ist meine persönliche Ansicht.

                Ciao,
                 Martin

                --
                F: Was ist schneller: Das Licht oder der Schall?
                A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
              2. Moinsen!

                Es is warm hier im Buero und ich hab jetzt endlich Feierabend! Die vergessenen Links hab ich mittlerweile ja gepostet. Mit denen von Vinzenz hat man eigentlich n brauchbares Arsenal an Infos. Viel Spass beim Stoebern. Ueber die Suchmaschine Deiner Wahl findest Du sicher auch deutsche Dokus, falls noetig.

                ich dachte, Rouven und ich hätten unsere Artikel in deutscher Sprache verfasst. Sollte ich mich geirrt haben - oder ist es in Deinem Büro einfach zu warm? ;-)

                Meine Links führean aber auf englischsprachige Seiten. Glaub ich... (bei uns ist es gewöhnlich wärmer, als draussen)

                --
                "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                      - T. Pratchett
        2. Moin!

          Waere ein(e) SQL Tutorial/Doku nicht sinvoll gewesen?

          Da geht's mir doch wie dem Vinzenz und ich hab die geplanten Links vergessen...

          Da sind z.B.

          http://www.w3schools.com/Sql/sql_where.asp und folgende fuer SQL allgmein

          http://dev.mysql.com/doc/refman/5.0/en/select.html fuer mySQL im speziellen

          --
          "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                - T. Pratchett
  2. Hallo,

    Hierbei handelt es sich um Benutzer-IDs.

    die aus einer SQL-Abfrage stammen.

    Aus einer anderen Tabelle sollen jetzt anhand dieser IDs die Benutzer-Informationen der Benutzer gelesen werden und in ein weiteres Array gesetzt werden. Und zwar in der gleichen Reihenfolge wie im ersten Array (7,3,4).

    daher gehe ich davon aus, dass diese Reihenfolge durch die ORDER-BY-Klausel der ersten Abfrage vorgegeben ist.

    Es ist in ungefähr 999999 von einer Million Fällen eine sehr gute Idee, keine zwei Abfragen zu starten, sondern eine einzige, wobei die betreffenden Tabellen über einen Join miteinander verbunden sind.

    SELECT
       *
    FROM
       userinfos
    WHERE
       (id = '7'
       OR id = '3'
       OR id = '4')

    Hat jemand vielleicht eine Idee, wie sich mein Vorhaben realisieren lässt?

    SELECT  
       spaltenliste  
    FROM  
       userinfos  
    INNER JOIN  
       andereTabelle  
    ON  
       userinfos.id = andereTabelle.id  
    ORDER BY  
       andereTabelle.SpalteDieDieReihenfolgeDeinerIDsVorgibt  
    
    

    Für ein solches Problem komplizierten PHP-Code zu verwenden, ist keine besonders gute Idee. Löse Dein Problem mit SQL.

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      Es ist in ungefähr 999999 von einer Million Fällen eine sehr gute Idee, keine zwei Abfragen zu starten, sondern eine einzige, wobei die betreffenden Tabellen über einen Join miteinander verbunden sind.

      Hallo Vinzenz,

      erstmal Danke für deine Antwort.
      Dass man so wenig Abfrage wie möglich machen soll, ist mir bewusst.
      Die SQL-Funktionen INNER JOIN und ON sind mir aber bisher noch nicht begegnet.

      Ich werde mir diese mal direkt anschauen. Danke.

      1. Hi!

        erstmal Danke für deine Antwort.
        Dass man so wenig Abfrage wie möglich machen soll, ist mir bewusst.
        Die SQL-Funktionen INNER JOIN und ON sind mir aber bisher noch nicht begegnet.

        Aber where ja scheinbar schon. Das ist ein Join. "WHERE table1.ID IN (3, 4, 7) AND table1.ID = table2.ID" ist SQL Grundwissen.

        Dachte ich.

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
      2. Hallo,

        Es ist in ungefähr 999999 von einer Million Fällen eine sehr gute Idee, keine zwei Abfragen zu starten, sondern eine einzige, wobei die betreffenden Tabellen über einen Join miteinander verbunden sind.

        Dass man so wenig Abfrage wie möglich machen soll, ist mir bewusst.
        Die SQL-Funktionen INNER JOIN und ON sind mir aber bisher noch nicht begegnet.
        Ich werde mir diese mal direkt anschauen. Danke.

        ich hatte doch neben der WHERE-Klausel, die die Ergebnisse auf die von Dir gewünschten ID-Werte einschränken soll, glatt die Links zu unseren Join-Artikeln in SELFHTML aktuell vergessen:

        Freundliche Grüße

        Vinzenz

  3. Hi,

    Aus einer anderen Tabelle sollen jetzt anhand dieser IDs die Benutzer-Informationen der Benutzer gelesen werden und in ein weiteres Array gesetzt werden. Und zwar in der gleichen Reihenfolge wie im ersten Array (7,3,4).

    Bspw. die Funktionen FIELD oder FIND_IN_SET lassen sich recht simpel "missbrauchen", um MySQL-seitig eine Sortierung nach vorgegebener Wert-Reihenfolge zu erzielen.

    Aber das brauchst du noch nicht mal unbedingt:

    Diesen Query habe ich nun genutzt, um die Benutzer-Informationen aus der Tabelle auszulesen. Leider jedoch ist das neue Array wieder nach den IDs geordnet (3,4,7 - ASC) und nicht so, wie ich es haben wollte (7,3,4).

    Wenn du in deinem "neuen" Array die Werte mit der ID als Schlüssel ablegst - dann brauchst du doch nur noch dein "altes" Array mittels foreach durchlaufen, und kannst mit dessen jeweiligem Wert auf das "neue" Array zugreifen, in dem du ihn dort als Schlüssel benutzt. (Man sollte dann noch abprüfen, ob ein Eintrag mit dem Schlüssel im neuen Array auch vorhanden ist, wenn es nicht als absolut sicher gelten kann, dass dieses für jede der gesuchten IDs auch einen Eintrag enthält.)

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
  4. Hi,

    Ich habe in einem anderen Thema schon ein derartigen Problem kämpfen müssen.

    Hätte ich gleich gesehen, dass du das gleiche schon in deinem anderen Thread gefragt hast, hätte ich dir hier gar nicht erst geantwortet.

    Bitte unterlasse künftig unerwünschte Doppelpostings, und bleibe in deinem bestehenden Thread -

    Dort ging es am Ende allerdings um die Funktion usort

    • das gilt auch dann, wenn du dort mit einem Vorschlag in eine Sackgasse geraten bist.

    So lange dein Problem das gleiche ist und bleibt, bleibe damit bitte auch im bestehenden Thread.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hi,

      Hätte ich gleich gesehen, dass du das gleiche schon in deinem anderen Thread gefragt hast, hätte ich dir hier gar nicht erst geantwortet.

      Ich entschuldige mich hierfür. Ich dachte nur, dass dies eine völlig andere Sache ist und vielleicht in einem neuen Thema geöffnet werden sollte.

      • das gilt auch dann, wenn du dort mit einem Vorschlag in eine Sackgasse geraten bist.

      So habe ich das noch nicht betrachtet.

      So lange dein Problem das gleiche ist und bleibt, bleibe damit bitte auch im bestehenden Thread.

      Werd in Zukunft darauf achten, danke.