[PHP] SQL befüllen + Ergebnis Sortierung

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Neo311087, 24. Januar 2011 .

  1. 24. Januar 2011
    SQL befüllen + Ergebnis Sortierung

    Hallo zusammen,

    Also ich würde gerne mehrere Hundert Dateien auslesen, bestimmte Zeilen in ein Array schreiben und den Inhalt des Arrays in die WHERE Bedingung schreiben. Alles kein Problem ABER die WHERE Bedingungen müssen ja durch Kommata getrennt werden. Wie löse ich dies am elegantesten?

    Meine Vorgehensweise wäre:

    Jedem Wert im Array ein Kommata anhängen und den letzten auslassen. Jedoch finde ich diese Lösung sehr unsauber... habt ihr eine andere Idee?

    Zweite Frage: ich befülle die WHERE Bedingung in einer bestimmten Reihenfolge, und möchte auch in dieser Reihenfolge die Ergebnisse sortiert haben ( da die Zahlen in der WHERE Bedingung mit denen im Ergebnis verknüpft ist ), ich hab jedoch die Befürchtung er wird mir das Ergebnis Aufsteigend / Absteigend nach Größe sortieren, wie verhinder ich das? Ich hätte es kurz Googlen können, aber wenn ich hier schonmal ne Frage stell kann ich die ja gleich mit rein schmeissen

    VG

    Neo

    / Achja es ist die Abfrage einer verdammt riesigen Oracle Datenbank mit mehreren Millionen Datensätzen, deswegen soll es alles in einem SQL gemacht werden und nicht in Hundert einzelnen ( was definitiv einfacher wäre^^ ).
     
  2. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    zu 1.
    PHP: implode - Manual

    zu 2.
    mit php abarbeiten (in ner rekursiven funktion einfach den jeweils nächsten eintrag entfernen) ist definitiv schneller als in ner riesen db mit sql zu versuchen die sachen zu sortieren.
     
  3. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    1. Super danke, das ist perfekt
    2. Hmm aber die Einträge haben ja absolut keine Verbindung zueinander ausser das sie in der gleichen Reihenfolge abgearbeitet werden. Und mehrere SQLs ist unschön, da ein SELECT ca 10-20 Sekunden brauch ( wird auch noch von mehreren Hundert Mitarbeitern gleichzeitig mit gearbeitet ) und da bei 400 Dateien ( aktueller Stand ) schon einige Zeit zusammen kommt.
     
  4. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    deswegen sag ich ja, dass du den query so klein wie möglich halten solltest. wenn du in den query jetzt noch eine spezielle sortierung implementierst zieht sich das ganz noch mehr in die länge.

    PHP:
    <? php

    $conds 
    = array( 10 5 1049 6 80 55 );  // ids in diese reihenfolge

    // query ...
    $daten  mysql_query (... .  impode ( ',' $conds ));  // du weißt schon

    $items  = array();
    while(
    $item  mysql_fetch_assoc ( $daten ))
        
    $items [] =  $item ;
        
    // nehmen wir an, dass das feld "id" den entsprechenden wert hat, der in $conds gespeichert wurde

    $sorted  sort_by_conds ( $items $conds );

    function 
    sort_by_conds (array & $items , array & $conds )
    {
        
    $result  = array();
        
        foreach(
    $conds  as  $c ) {
            
    reset ( $items );
            
            while(list(
    $k $v ) =  each ( $items )) {
                if(
    $v [ 'id' ] ==  $c ) {
                    
    $result [] =  $v ;
                    unset(
    $items [ $k ]);
                    break;
                }
            }
        }
        
        return 
    $result ;
    }
     
  5. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Puh ok, ich habe befürchtet es so lösen zu müssen, hätte gedacht es gibt ne einfache "Anweisung" die dem SQL sagt er soll mir die Ergebnisse in der Reihenfolge zurück geben in der sie an/abgefragt werden ...

    /ich merk grad ich red it, da es ja nur eine Anweisung an eine WHERE Bedingung geknüpft ist, aber ich denke man weiß was ich meinte Das es mir die Antwort Zeilen quasi in der Reihenfolge ausgibt wie sie in der WHERE Bedingung stehen.^^
     
  6. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    wenn du sie mit einem komma separierst, denke ich du verwendest die sachen in einem IN() ausdruck. im normalfall sollten die datensätze unsortiert sein, teste doch einfach mal.
     
  7. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Er sortiert es der Größe nach aufsteigend... miese ..
     
  8. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    jo, dann musst du wohl meine funktion oben verwenden oder deine programm-logik überdenken
     
  9. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Gibts ne Funktion die ein Array nach Größe der Zahlen sortieren kann, dann würde ich anders an die Sache ran gehen, nämlich das Array mit den Werten die ich Abfrag der Größe nach Ordnen und beim SQL direkt der Größe nach Ordnen, dann ists ja auch gerade gezogen.
     
  10. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    ich glaub du machst dir zu viele gedanken.
    poste doch mal ein wenig code damit man deine problematik besser versteht.

    aber zu deiner frage von grad eben, ja die gibt es
     
  11. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    PHP:
    $file_path  "c:/XXX/XXXX/XXXX/testdateien/" ;
    $open_dir  opendir ( $file_path );
    $y  0 ;

    while (
    $file  readdir ( $open_dir )) 
    {
    if (
    is_dir ( $file ))
    continue;

    if (
    preg_match ( "/.err/" , $file ) ==  true )
      {
        
    $inhalt  file ( $file_path . $file );
        
    $ford_nr [ $y ] =  substr ( $inhalt [ 30 ], 7 ,- 10 );
        
    $y ++;
      }
    }

    $comma_separated  implode ( "," $ford_nr );

    echo 
    $comma_separated ;

    $db_con  '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXXXX)(PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XXXX)))' ;
    $c  oci_connect ( "XXXXX" "XXXX" $db_con );
    $s  oci_parse ( $c 'select SCHULDNERNR from FPBEZIEHUNG where FORDNR IN (' . $comma_separated . ') AND FORDERGNR = 0' );
    oci_execute ( $s );

    $array_p  = array();
    $x  0 ;

    while (
    $res  oci_fetch_array ( $s OCI_ASSOC + OCI_RETURN_NULLS )) {
        foreach (
    $res  as  $item ) {
        
        
    $array_p [ $x ] =  $item ;
        
    $x ++;
        
        }
    }
    Das hab ich bis jetzt... , Problem ist halt das ausser mit deiner Sortierfunktion die SCHULDNERNR keine Beziehung zur FORDNR hat im Code. Deswegen wollte ich halt in einer bestimmten Reihenfolge abfragen, damit man diese eindeutig zuordnen kann.
    //Achja die FORDNR sind die Nummern die ich aus der XML ausles...
     
  12. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    dein code ist recht speicherintensiv, da du alle dateien in strings speicherst, das geht recht schnell auf die CPU (memory-handling) sowie RAM.

    ich hab das ma überarbeitet:
    PHP:
    <? php

    ini_set
    ( 'auto_detect_line_endings' true );

    $ford_nr  = array();
    $path     'pfad/' ;

    foreach(new 
    DirectoryIterator ( $path ) as  $i ) {
        if(
    $i -> isDot () ||  $i -> isDir () || ! $i -> isReadable ()
        || !
    preg_match ( '/.err/' $i -> getFileName ()))
            continue;
            
        
    $fp  fopen ( $i -> getPathName (),  'r' );
        for(
    $l  0 $l  <=  30  &&  fgets ( $fp ); ++ $l )
            ; 
    // 30 zeilen überspringen
            
        
    array_push ( $ford_nr substr ( fgets ( $fp ),  7 , - 10 ));
        
    fclose ( $fp );   
    }

    $db_con  '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXXXX)(PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XXXX)))' ;
    $c  oci_connect ( "XXXXX" "XXXX" $db_con );
    $s  oci_parse ( $c '
        select SCHULDNERNR 
        from FPBEZIEHUNG 
        where 
            FORDNR IN (' 
    implode ( ',' $ford_nr ) .  ') 
            AND FORDERGNR = 0'
    );
            
    oci_execute ( $s );

    $array_p  = array();
    while(
    $res  oci_fetch_array ( $s OCI_ASSOC  OCI_RETURN_NULLS ))
        
    $array_p [] =  $res ;
     
  13. 24. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Wieso selektierst du nicht `FORDNR` direkt mit? Dann kennst du doch die Beziehung.
    Und ansonsten kannst du ja $ford_nr (aus Murdoc's Code) mit sort vorher sortieren, damit die Sortierung mit der DB übereinstimmt.
     
  14. 25. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Danke dafür, ohne Hilfe wär ich wahrscheinlich nie darauf gekommen das es auch noch andere Möglichkeiten gibt, da ich die Funktionen einfach nicht kennt und auch nicht wüsste wie ich diese kennen lernen soll ohne mich intensiv damit zu beschäftigen ( was ich gerne machen würde aber die Zeit dafür einfach nicht hab ). Mach das auf der Arbeit eher Hobbymäßig und um einige Sachen für unser Team zu automatisieren.

    Eine Frage noch, nachdem ich die Werte die ich brauch aus der DB geholt hab müssen die an einer Stelle in der XML Datei einen anderen Wert / Zeile überschreiben. Hab leider nichts gefunden wo steht wie ich Zeilen manipulieren / ändern kann. Hast du da nen Stichwort für mich?

    Eine Frage noch:

    PHP:
    for( $l  0 , $l  <=  30  &&  fgets ( $fp ); ++ $l )
    Ich denke mal die benutzt fgets() um den Zeiger auf die richtige Zeile zu setzen, aber warum kommt der Code in Abbruch Bedingung der for Schleife?
     
  15. 27. Januar 2011
    AW: SQL befüllen + Ergebnis Sortierung

    Hab leider den Beitrag erst jetzt entdeckt...

    in Bezug auf SQL kannst du auch ganz einfach nen Custom Order machen z.B. per
    Code:
    ORDER BY FIELD( Feldname , "Banane" , "Kiwi" , "Orange" , "Apfel" )
    in deinem Fall ersetzt du das Obst durch deine ge"join()"ten IDs und fertig ist dein "(un)sortiertes" Query
     
  16. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.