Andreas Korthaus: Array sortierung

Beitrag lesen

Hallo!

Wieso nicht alles direkt in einer SQL-Abfrage machen?
siehe http://dev.mysql.com/doc/mysql/de/join.html

weil das nicht geht.

Geht das technisch nicht, also werden nicht die richtigen Daten abgefragt?

mein chef beschwert sich schon wenn ich in einem if
ein if hab.

Naja, das zeugt manchmal von ineffizientem Code, der von Dir ist ein hervorragendes Beispiel (es sei denn es geht nicht anders, was ich so nicht beurteilen kann), sorry ;-)
Das zu verallgemeinern ist allerdings Schwachsinn. Viel schlimmer als ein if im if ist ein if in einer Schleife. Noch viel schlimmer ist eine SQL-Abfrage in der Schleife, und noch schlimmer sind mehrere Abfragen in einer Schleife, oder Abfragen die auch noch sorieren müssen...

wenn ich dann komplexere sql abfragen mache, dann gibts wieder stress und jetzt kurz vor dem WE kann ich gut darauf verzichten.

*g*
Das ist nicht komplex, und es ist nur eine einzige Abfrage die alles so abfragt wie Du es vermutlich brauchst, fertig sortiert...

Ich kommentiere mal Deinen Code:

$sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";  
$benutze_prog_erg = mysql_query($sql);  
$benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten

Du willst die maximale ID für die Abfragen, um dann für jede ID von 1-MAX eine (sogar zwei) SQL-Abfragen an die DB zu schicken, die die benötigten Daten abfragt. Allerdings fragst Du nicht nur einen Datensatz ab, sondern es werden ALLE Daten in $tbl_lookup_amp (*) gruppiert nach id_programm von der Datenbank abgefragt. Zusätzlich werden alle Datensätze sortiert. Diese werden erstmal alle auf den CLient übertragen, Du benutzt dann aber nur einen einzigen der Datensätze. Hast Du 100 Produkt-IDs, werden auch 100 Datensätz übertragen. Die Daten bleiben bis zum Ende des Scriptes lokal im Speicher verfügbar, werden aber bis auf den einen Datensatz nicht abgefragt. Die JOIN-Variante ist alles in allem vermutlich kaum aufwändiger als diese eine Abfrage von Dir.

for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++) {

Falls auch mal ein Produkt aus der DB gelöscht wird, oder mal ein Fehler beim Anlegen passiert ist, fehlen Dir IDs, was Dich zu den Workarounds unten zwingt.
Wenn Du 100 IDs hast, werden hier jetzt noch 200 Anfragen an die DB geschickt, wie gesagt, wenn Du JOIN verwendest ist und bleibt es eine einzige.

  
  $sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)  
  $erg = mysql_query($sql);  
  if(mysql_num_rows($erg)>=1)  
  {  
    $daten = mysql_fetch_array($erg);  
    $sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?  
    $erg = mysql_query($sql);  
    $anzahl_user = mysql_num_rows($erg);  
    if ($anzahl_user>0)  
    {  
      $prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array  
      echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";  
    }  
  }  
}

Bis auf den Programm-Namen fragst Du hier in der Schleife für jede einzelne  ID Informationen ab, die Du bereits aus der allerersten Abfrage hast. Den Namen kannst Du Dir dann sehr einfach per JOIN besorgen. Dazu kommt dass Du mit Deiner Variante die Daten am Ende nocheinmal in PHP sortieren musst.

Wenn Dein Chef sich aufregt dass Du if in if verwendest, kann ich mir nicht vorstellen dass er mit solchen Schleifen zufrieden ist, außerdem verwendest Du immer * wordurch wahrscheinlich viel zu viele Daten übertragen und in den Arbeitsspeicher geladen werden. Du fragst z.B. in jedem Schleifendurchlauf ALLE Daten, die die Datenbank in $tbl_lookup_amp zu einem Produkt stehen hat ab, nur um die Datensätze zu zählen, und das wohl gemerkt in einer Schleife!

Aber gut, musst Du natürlich selbst wissen wie Du das machst ;-)

Grüße
Andreas

--
SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/