dennislasch: PHP MySQL Abfrage sortieren

Hello,

ich habe ein Script, das pro Datensatz in Tabelle x, eine Zeile einfügt. Darin habe ich nochmal eine Abfrage von Tabelle y pro abgerufene Zeile aus Tabelle x.

PHP Code:

  
# Abfragen  
$n1 = 'SELECT year, number FROM `x` ORDER BY '.$field.' '.$sort;  
$n2 = mysql_query($n1);  
  
# Pro Ausgabe  
while($row = mysql_fetch_object($n2)) {  
 # Anzahl  
 $res = mysql_query('SELECT COUNT(id) AS anzahl FROM `y` WHERE `issue`='.$row->number.$row->year);  
 $ty = mysql_fetch_array($res);  
}  

Nach einem Feld in Tabelle x zu sortieren ist kein Problem. Aber wenn ich jetzt z.B. nach der Anzahl in Tabellee y das Ganze sortieren will, weiß ich nicht weiter.

Gibt es eine andere Möglichkeit als das Ganze erst in einen Array zu speichern und den nach kompletter Abfrage auszugeben?

Danke für eure Hilfe.

Regards,
Dennis

  1. Hallo Dennis,

    welche MySQL-Version verwendest Du?

    ich habe ein Script, das pro Datensatz in Tabelle x, eine Zeile einfügt. Darin habe ich nochmal eine Abfrage von Tabelle y pro abgerufene Zeile aus Tabelle x.

    So was macht man nicht. Es gibt Joins

    $n1 = 'SELECT year, number FROM x ORDER BY '.$field.' '.$sort;

    while($row = mysql_fetch_object($n2)) {

    Das tut weh. Sowas macht man nicht. Sowas vermeidet man unter nahezu allen
    Umständen. Abfragen in einer Schleife deutet in nahezu allen Fällen auf
    anfängerhafte Fehler hin.

    $res = mysql_query('SELECT COUNT(id) AS anzahl FROM y WHERE issue='.$row->number.$row->year);

    Aber wenn ich jetzt z.B. nach der Anzahl in Tabellee y das Ganze sortieren will, weiß ich nicht weiter.

    Gibt es eine andere Möglichkeit als das Ganze erst in einen Array zu speichern und den nach kompletter Abfrage auszugeben?

    Wozu? Vergiß PHP! Nimm SQL!
    Ich vermute, dass folgende Query das liefert, was Du haben möchtest.

    SELECT  
        COUNT(y.id) AS anzahl,  
        x.number,  
        x.year  
    FROM  
        y  
    INNER JOIN  
        x  
    ON  
        y.issue = CONCAT(x.number, x.field)  
    GROUP BY  
        x.number,  
        x.year  
    ORDER BY anzahl
    

    In Abhängigkeit von Deinen (leider unbekannten) Daten könnte auch eine leicht
    modifizierte Version erforderlich sein. Falls meine Abfrage nicht das gewünschte Ergebnis liefert, so bitte ich Dich darum ein paar Beispieldaten und das daraus sich ergebende Resultat zu posten - mit der Begründung, warum
    Du dieses Resultat haben möchtest.

    Freundliche Grüße

    Vinzenz

    1. Hello Vinzenz,

      while($row = mysql_fetch_object($n2)) {

      Das tut weh. Sowas macht man nicht. Sowas vermeidet man unter nahezu allen
      Umständen. Abfragen in einer Schleife deutet in nahezu allen Fällen auf
      anfängerhafte Fehler hin.

      Wo siehst Du da eine Abrage in einer Schleife?
      Du meintest mit "Abfrage" doch Mysaql_Query()?

      Ich sehe da nur das Auslesen des Abfrageergebnisses in einer Schleife und das machet 'man' doch eigentlich immer so. Sollte ich mich da irren?

      Ich kann Dir alos gerade nicht folgen...

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hello,

        Ich sehe da nur das Auslesen des Abfrageergebnisses in einer Schleife und das machet 'man' doch eigentlich immer so. Sollte ich mich da irren?

        ist das ein Wink mit dem Zaunpfahl auf ungenaue Zitierweise? Schau in den Originalquellcode - es läuft eine Schleife und innerhalb der Schleife wird auf Basis des von Vinzenz zitierten $row-Arrays eine weitere Abfrage gemacht.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        I will never understand why Germans feel the need to kill trees  --  Arbeitskollege aus UK zum Thema ob eine Dokumentation elektronisch oder auf Papier ausgeliefert wird
      2. Hallo Tom,

        while($row = mysql_fetch_object($n2)) {

        Das tut weh. Sowas macht man nicht. Sowas vermeidet man unter nahezu allen
        Umständen. Abfragen in einer Schleife deutet in nahezu allen Fällen auf
        anfängerhafte Fehler hin.

        Wo siehst Du da eine Abrage in einer Schleife?
        Du meintest mit "Abfrage" doch Mysaql_Query()?

        in dem Teil, den Du entweder überlesen oder unterschlagen hast. Jedenfalls hast Du die nächsten Codezeilen, die direkt darunter standen, nicht zitiert:

        $res = mysql_query('SELECT COUNT(id) AS anzahl FROM y WHERE issue='.$row->number.$row->year);

        Ich sehe da nur das Auslesen des Abfrageergebnisses in einer Schleife und das machet 'man' doch eigentlich immer so. Sollte ich mich da irren?

        Ja, selbstverständlich irrst Du. Man liest nicht Ergebnisse aus, um eine (oder hier zwei Spalten) jeder Zeile für viele, viele weitere Queries zu verwenden.
        Das macht man nicht, da baut man einen Join von Hand zu Fuß nach. Das ist
        anfängerhaft - und bei PHP-Programmierern ohne SQL-Kenntnisse oft zu sehen.

        Ich kann Dir alos gerade nicht folgen...

        Lesen hilft ;-)

        Freundliche Grüße

        Vinzenz

    2. Hallo Dennis,

      welche MySQL-Version verwendest Du?

      ich habe ein Script, das pro Datensatz in Tabelle x, eine Zeile einfügt. Darin habe ich nochmal eine Abfrage von Tabelle y pro abgerufene Zeile aus Tabelle x.

      So was macht man nicht. Es gibt Joins

      $n1 = 'SELECT year, number FROM x ORDER BY '.$field.' '.$sort;

      while($row = mysql_fetch_object($n2)) {

      Das tut weh. Sowas macht man nicht. Sowas vermeidet man unter nahezu allen
      Umständen. Abfragen in einer Schleife deutet in nahezu allen Fällen auf
      anfängerhafte Fehler hin.

      $res = mysql_query('SELECT COUNT(id) AS anzahl FROM y WHERE issue='.$row->number.$row->year);

      Aber wenn ich jetzt z.B. nach der Anzahl in Tabellee y das Ganze sortieren will, weiß ich nicht weiter.

      Gibt es eine andere Möglichkeit als das Ganze erst in einen Array zu speichern und den nach kompletter Abfrage auszugeben?

      Wozu? Vergiß PHP! Nimm SQL!
      Ich vermute, dass folgende Query das liefert, was Du haben möchtest.

      SELECT

      COUNT(y.id) AS anzahl,
          x.number,
          x.year
      FROM
          y
      INNER JOIN
          x
      ON
          y.issue = CONCAT(x.number, x.field)
      GROUP BY
          x.number,
          x.year
      ORDER BY anzahl

      
      >   
      > In Abhängigkeit von Deinen (leider unbekannten) Daten könnte auch eine leicht  
      > modifizierte Version erforderlich sein. Falls meine Abfrage nicht das gewünschte Ergebnis liefert, so bitte ich Dich darum ein paar Beispieldaten und das daraus sich ergebende Resultat zu posten - mit der Begründung, warum  
      > Du dieses Resultat haben möchtest.  
      >   
      >   
      > Freundliche Grüße  
      >   
      > Vinzenz  
        
      Hallo zusammen,  
        
      musste mir grad mal wieder meinen Teil denken: So macht man das doch nicht - hehe, und wie macht man das dann? LOL  
        
      Ich hätte da eine Idee: Wenn ich wissen möchte, wieviel Daten in einer Abfrage sind, dann nutze ich die mysql\_num\_rows Funktion.  
      Die kannst Du einfach unter Deine Abfrage stellen, brauchst da keine Extra Anfrage an die Datenbank für stellen.  
        
      Ich hoffe, dass Dir das im Moment weiterhilft  
      Liebe Grüße aus dem Ruhr-Gebiet  
      Edgar  
        
      [Professionelle Internetauftritte](http://www.ruhr-promotion.de) [Kostenloser Homepagetest](http://service.ruhr-promotion.de/homepage-test/index.html)
      
      1. Hallo Edgar,

        musste mir grad mal wieder meinen Teil denken: So macht man das doch nicht -

        ja, Fullquotes sind keine gute Idee.

        Ich hätte da eine Idee: Wenn ich wissen möchte, wieviel Daten in einer Abfrage sind, dann nutze ich die mysql_num_rows Funktion.

        entweder kriegt man nicht die gewünschte Anzahl "pro Ausgabe" oder man fragt
        wieder in Serie ab, nur um die erhaltenen Daten im Prinzip unbenutz wegzuwerfen.

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          entweder kriegt man nicht die gewünschte Anzahl "pro Ausgabe"

          da kenn ich aber anders. Hast du evtl die Abfrage mit LIMIT begrenzt?
          Also ich persönlich benutze die Abfrage um hinter Links anzuzeigen, wieviel Seiten noch dahinter folgen, und das klappt prima.

          Schick mir doch mal den Code per Mail, zwischen den Feiertagen hab ich etwas Zeit, ich gugg mir das mal in Ruhe an.
          Denn: Geht net, gibts net, ;-)

          In diesem so langsam schonmal: Besinnliche Feiertage, und nen ordentlichen Rutsch
          Edgar

          http://service.ruhr-promotion.de/homepage-test/index.html