Array sortieren + Ausgabe (aus MySQL)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array sortieren + Ausgabe (aus MySQL)

    Hallo,

    ich habe im Forum schon gesucht, leider nichts passendes gefunden.
    Vielleicht kann mir ja irgendjemand helfen mein 'kleines' Problem zu lösen.

    Ich lese aus einer MySQL Datenbank Angebote aus, diese Speichere ich in einem Array.
    Jetzt kommt die schwierigkeit, es sind 3 Tabellen in meiner SQL Abfrage und 2 Spalten die für die Preise zuständig sind, einmal die normale_preise und einmal die Festpreise.
    Es können Angebote auftreten, wo etwas in normale preise und etwas in normale_preise steht, dann soll er nur die festpreise nehmen ....

    PHP-Code:
    $sql"SELECT lsn_ang.ID, lsn_ang.zuart, lsn_ang.ort, lsn_ang.preis_normal, lsn_ang.preis_angebot, lsn_arts.ID, lsn_arts.festpreis, lsn_arts.zukat, lsn_arts.art_long, lsn_kat.ID, 
    lsn_kat.long, lsn_kat.tae, lsn_kat.SHOP 
    FROM lsn_ang lsn_ang, lsn_arts lsn_arts, lsn_kat lsn_kat
    Where 
    lsn_arts.ID = lsn_ang.zuart
    AND lsn_ang.online = 1
    AND lsn_kat.SHOP = 'L'
    AND lsn_kat.ID = lsn_arts.zukat
    AND ((lsn_ang.preis_normal <= '"
    .$preis."'
    AND lsn_ang.preis_normal >     0)
    OR (lsn_arts.festpreis <= '"
    .$preis."'
    AND lsn_arts.festpreis > 0))"



    $res mysql_query($sql);
    echo 
    mysql_error(); 
        if(
    $res<>""){    
            
    $maxRows mysql_num_rows($res);
                if(
    $maxRows>0){
                    for(
    $i 0$i $maxRows$i++){
                        
    //$ausgabepreise[$i]=mysql_fetch_array($res);
                        
    $komplett[] = $ausgabepreise[$i]=mysql_fetch_array($res);
                        
    $festpreis[]=$ausgabepreise[$i]["festpreis"];
                        
    $preis_normal[]=$ausgabepreise[$i]["preis_normal"];
    $angebot[] = $ausgabepreise[$i]["tae"];
    if(
    $ausgabepreise[$i]["festpreis"] != ""){
    $preis_n[] =$ausgabepreise[$i]["festpreis"];
    $angebot[] = $ausgabepreise[$i]["tae"];
    sort($preis_n);
    foreach(
    $preis_n as $test){
    echo 
    $test"<br />"
    }
    }
    elseif(
    $ausgabepreise[$i]["festpreis"] == ""){
    $preis_n[] = $ausgabepreise[$i]["preis_normal"];
    $angebot[] = $ausgabepreise[$i]["tae"];
    }
    }
    }

    Ihr seht, ich muss das ding auch noch sortieren, so das die Preise aufsteigend sind.
    Hat vielleicht irgendwer eine Idee wie ich dieses effizienter und funktionierend bekomme?

    Also mit MySQL habe ich nicht so die Probleme, aber PHP klappt leider nicht immer so wie ich mir das denke.
    Wäre über eine 'Idee' sehr dankbar!

    Achso an eine Sortierung mittels SQL habe ich auch gedacht funktioniert leider nicht, weil (meines Wissens) SQL nur nacheinander Sortieren kann.
    Also würde ein
    ORDER BY lsn_arts.festpreis, lsn_ang.preis_normal ASC nichts bringen
    Die Ausgabe würde z.B. so aussehen
    20,30,40,50 (preis_normal) und 20,30,40,50 (festpreis)
    Es muss aber so aussehen
    20,20,30,30,40,40,50,50

    Vielleicht jemand eine Idee?
    Thx

  • #2
    als erstes solltest du imho LEFT JOINs verwenden.

    Dann mittels IF() entscheiden ob der Festpreis gewählt wird oder der ander und den jeweiligen dann im Alias my_price speichern. Danach kannst du dann mit ORDER BY sortieren.

    Ansonsten habe ich keine Lust mich in den Wust da einzuarbeiten...

    *move* nach SQL, weil PHP dafür überflüssig ist.

    Kommentar


    • #3
      argl, es ist ekelich einen JOIN über WHERE zu realisieren - blickt ja keiner mehr durch was da die Verbindungen sind...
      Schreib das mal vernünftig als
      SELECT * FROM tabelle a INNER JOIN tabelle b ON a.id = b.id INNER JOIN tabelle c ON b.kat = c.id WHERE a.id = 5
      oder so. Das kann man deutlich schneller verstehen.


      ansonsten:
      PHP-Code:
      SELECT lsn_ang.IDlsn_ang.zuartlsn_ang.ort,
          
      lsn_ang.preis_normallsn_ang.preis_angebot,
          
      lsn_arts.IDlsn_arts.festpreislsn_arts.zukat,
          
      lsn_arts.art_longlsn_kat.IDlsn_kat.longlsn_kat.taelsn_kat.SHOP 
      FROM lsn_ang lsn_ang
      lsn_arts lsn_artslsn_kat lsn_kat
      Where 
      lsn_arts
      .ID lsn_ang.zuart
      AND lsn_ang.online 1
      AND lsn_kat.SHOP 'L'
      AND lsn_kat.ID lsn_arts.zukat
      AND
      (
          (
      lsn_ang.preis_normal <= '".$preis."' AND lsn_ang.preis_normal 0)
          OR
          (
      lsn_arts.festpreis <= '".$preis."' AND lsn_arts.festpreis 0)
      )

      ORDER BY CASE WHEN lsn_arts.festpreis 0 THEN lsn_arts.festpreis ELSE lsn_ang.preis_normal END ASC 
      case für die Sortierung

      OffTopic:
      @Tobiaz - ne, afaik wieder kein LEFT JOIN (muss zumindest nicht sein) - was hast du damit nur ständig? Oo
      Zuletzt geändert von ghostgambler; 25.09.2007, 19:30.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Nochmals als JOIN (gerade bei größeren Datenmengen normalerweise ein wenig schneller):
        PHP-Code:
        SELECT FROM lsn_arts
        INNER JOIN lsn_ang ON lsn_arts
        .ID lsn_ang.zuart
        INNER JOIN lsn_kat ON lsn_kat
        .ID lsn_arts.zukat
        WHERE lsn_ang
        .oline 1
        AND lsn_kat.SHOP 'L'
        AND
        (
                (
        lsn_ang.preis_normal <= '".$preis."'
                
        AND lsn_ang.preis_normal 0)
            OR
                (
        lsn_arts.festpreis <= '".$preis."'
                
        AND lsn_arts.festpreis 0)
        )
        ORDER BY
            
        CASE
                
        WHEN lsn_arts.festpreis 0 THEN
                    lsn_arts
        .festpreis
                
        ELSE
                    
        lsn_ang.preis_normal
            END
        ASC 
        Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

        Kommentar


        • #5
          Original geschrieben von ghostgambler
          @Tobiaz - ne, afaik wieder kein LEFT JOIN (muss zumindest nicht sein) - was hast du damit nur ständig? Oo
          Bei dem fiesen Spaltenselect war es mich auf die schnelle nicht möglich das Vorhaben/den Sinn zu erkennen.

          Daher simple Wahrscheinlichkeitsrechnung: In meiner Zeit hier im Forum sind mir bis jetzt am meisten LEFT JOINS unter gekommen. Anscheinend ist die Nachfrage danach aber in letzter Zeit zurück gegangen.

          Kommentar


          • #6
            OffTopic:
            Tsk, faule Nudel, lieber Wahrscheinlichkeitsrechnung, anstatt sich den Query nochmal anzuschauen

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Erstmal vielen dank, die Case könnte mir weiterhelfen, da es eigentlich sql ist (was ich wirklich nicht wusste, dass man das so regeln kann) schreib ich dennoch hier meine 'weitere' Frage rein.

              Der Administrator kann den Beitrag ja verschieben, falls er hier wirklich fehl am Platz ist.

              Also die Ausgabe ist schon beachtlich besser, aber er nimmt das Limit nicht mehr.

              Ich habe die Anweisung jetzt wie folgt angepasst:
              PHP-Code:
               SELECT lsn_ang.IDlsn_ang.zuartlsn_ang.ortlsn_ang.preis_normallsn_ang.preis_angebotlsn_arts.IDlsn_arts.festpreislsn_arts.zukatlsn_arts.art_longlsn_kat.IDlsn_kat.longlsn_kat.taelsn_kat.SHOP
              FROM lsn_ang lsn_ang
              lsn_arts lsn_artslsn_kat lsn_kat
              WHERE lsn_arts
              .ID lsn_ang.zuart
              AND lsn_ang.online =1
              AND lsn_kat.SHOP 'L'
              AND lsn_kat.ID lsn_arts.zukat
              AND (
              (
              lsn_ang.preis_normal <= '50'
              AND lsn_ang.preis_normal >0
              )
              OR (
              lsn_arts.festpreis <= '50'
              AND lsn_arts.festpreis >0
              )
              )
              ORDER BY CASE WHEN lsn_arts.festpreis >0
              THEN lsn_arts
              .festpreis
              ELSE lsn_ang.preis_normal
              END ASC
              LIMIT 0 
              30 
              Als 'Debug' habe ich es jetzt mal so ausgegeben

              PHP-Code:
              echo '<table><tr>
              <td>'
              .$ausgabepreise[$i]["tae"].'</td>
              <td>&nbsp;</td>
              <td>'
              .$ausgabepreise[$i]["preis_normal"].'</td>
              <td>'
              .$ausgabepreise[$i]["festpreis"].'</td>
              </tr>
              </table>'

              Die Ausgabe ist jetzt so:

              Aktivität 0 198
              Sprich, Aktivitätsname, 0 Euro ist der preis_normal, 198 Euro ist der Preis festpreis.
              Obwohl ich ein Limit auf 50 Euro festgelegt habe.

              Wie kann das sein? Was kann ich ändern? Jemand zufällig eine Idee?
              Wenn ich die When Case richtig verstanden habe,
              Fragt er bei der ORDER Klauser, wenn festpreis größer 0 dann nimm festpreis, alternativ nimm preis normal ...
              Aber bei der Ausgabe sind beide Werte vorhanden, sowohl festpreis , also auch preis normal. die sollen ja auch beide da sein, nur Priorität hat der Festpreis.... erst dann kommt preis normal. Und es sollte so sortiert sein, als sei es ein Datensatz.

              Habt ihr vielleicht noch einen Denkanstoß für mich?
              Vielen Dank

              Kommentar


              • #8
                preis_normal und festpreis sind (hoffentlich) integer Spalten, also vergleiche nicht mit Strings (50 statt '50').

                Brauchst du eigentlich beide Werte später oder wiederholst du den CASE bei der Ausgabe? Dann würde ich mich nämlich TobiaZ erstem Post anschließen - statt CASE im ORDER BY genügt ein IF() AS myprice im SELECT mit entsprechendem ORDER BY myprice.

                Kommentar


                • #9
                  Hallo onemorenerd,

                  danke für die Antwort, leider habe ich feststellen müssen, dass es sich einmal um einen Integer und einmal um ein Varchar(50) handelt.

                  Zu meiner verteidigung muss ich sagen, ich habe die Tabellen nicht erstellt, nur (beruflich) übernommen.

                  Gibt es vielleicht ein Convert in Mysql ?

                  Kommentar


                  • #10
                    Aha, einmal int und einmal varchar ... aber nicht beides gleichzeitig.
                    x <= '50' AND x > 0 ist also weiterhin Quark.

                    Spaltenkonvertierung geht z.B. mit
                    ALTER TABLE tbl_name MODIFY col_name [INT|VARCHAR|...]
                    wahlweise noch NOT NULL hinten dran.

                    Du solltest natürlich absolut sicher sein, dass die varchar-Spalte wirklich immer nur mit Zahlen gefüllt wird. (Ich nehme an, du hast nicht nur die DB sondern auch die zugehörigen Applikationen übernommen.)

                    Kommentar


                    • #11
                      ich habe alles übernommen genau,
                      leider kann ich die Spalte nicht komplett convertieren, da ein gesamter Shop daran hängt....

                      Jetzt muss ich mir irgendwie überlegene, wie ich das ändern kann.
                      Vielleicht mit einem Array und dann eine Typenumwandlung mit (int) so dass ich dann sortieren kann.

                      Hm dann war die vorherige Arbeit umsonst, das ist miest.
                      Nur weil dieser dämliche ... für preise einmal int / varchar / Text verwendet hat.
                      Nadoll, aber vielen Dank für die Hilfe

                      Kommentar


                      • #12
                        Lass doch die Spalten wie sie sind, caste einfach in deiner Query.

                        CAST(expr AS type)

                        Kommentar


                        • #13
                          Hallo,

                          ich habe es mal mit dem CAST versucht und auch im Referenzbuch nachgeschaut und ausprobiert (seit 4)
                          Aber irgendwie meldet der immer Fehler beim Convertieren

                          So sieht mein SQL Befehl jetzt aus:
                          PHP-Code:
                          SELECT lsn_ang.IDlsn_ang.zuartlsn_ang.ortlsn_ang.preis_normallsn_ang.preis_angebot
                              
                          lsn_arts.IDlsn_arts.festpreis lsn_arts.art_kurz  lsn_arts.zukatlsn_arts.art_longlsn_kat.ID
                          lsn_kat.longlsn_kat.taelsn_kat.SHOP 
                          FROM lsn_ang lsn_ang
                          lsn_arts lsn_artslsn_kat lsn_kat
                          Where 
                          lsn_arts
                          .ID lsn_ang.zuart
                          AND lsn_ang.online 1
                          AND lsn_kat.SHOP 'L'
                          AND lsn_kat.ID lsn_arts.zukat
                          AND ((lsn_ang.preis_normal <= ".$preis."
                          AND lsn_ang.preis_normal 0)
                          OR (
                          CAST(lsn_arts.festpreis as SIGNED INT(10)) <= ".$preis."
                          AND CAST(lsn_arts.festpreis as SIGNED INT(10) > 0))
                          ORDER BY CASE WHEN CAST(lsn_arts.festpreis as SIGNED INT(10)) > 0 THEN CAST(lsn_arts.festpreis as SIGNED INT(10
                          ELSE 
                          lsn_ang.preis_normal END 
                          ASC 
                          Oder habe ich das CAST falsch definiert?

                          Ich habe zur Sicherheit alle Werte nochmal geprüft. $preis ist Integer
                          PHP-Code:
                          $preis = (int) $preis
                          Sorry das ich immer Frage, aber ich bekomm es irgendwie nicht ans laufen

                          ich benutze die MySQL 3.23.58, laut Manual gibt es die CAST in der Version schon
                          Zuletzt geändert von none; 27.09.2007, 07:13.

                          Kommentar


                          • #14
                            Versuch mal

                            CAST(lsn_arts.festpreis as SIGNED)
                            gruss Chris

                            [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                            Kommentar


                            • #15
                              Leider auch da einen Fehler

                              phpmyadmin sagt :

                              #1064 - You have an error in your SQL syntax near '( lsn_arts.festpreis as SIGNED ) <= 50 AND CAST( lsn_arts.festpreis as SIGNED ) ' at line 1

                              Sehr komisch das ganze

                              Kommentar

                              Lädt...
                              X