#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^^ ). + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 ;} + Multi-Zitat Zitieren
#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.^^ + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#7 24. Januar 2011 AW: SQL befüllen + Ergebnis Sortierung Er sortiert es der Größe nach aufsteigend... miese .. + Multi-Zitat Zitieren
#8 24. Januar 2011 AW: SQL befüllen + Ergebnis Sortierung jo, dann musst du wohl meine funktion oben verwenden oder deine programm-logik überdenken + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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... + Multi-Zitat Zitieren
#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 ; + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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? + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren