Sortierung (werte zuerst)

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

  • Sortierung (werte zuerst)

    Hallo,
    ich möchte eine Ausgabe sortieren.
    Zuerst sollen die Nicknamen Alpabetisch sortiert werden und danach die Ergebnisse, die keinen Nicknamen haben und leer sind.
    PHP-Code:
        $sql    "SELECT 
                                            
                        t3.nickname
              
                FROM 
                    "
    .PROFIL." t1
                LEFT JOIN "
    .USER." t2 ON t2.id = t1.user_id
                LEFT JOIN "
    .profil." t3 ON t3.user_id = t1.user_id            
                GROUP BY t1.id
                ORDER BY nickname ASC 
    Das ist die orginale Abfrage.
    Ich dachte jetzt an sowas.

    PHP-Code:
        $sql    "SELECT 
                                            
    t3.nickname,                    
    t3.nickname != '' AS nickname2
              
                FROM 
                    "
    .PROFIL." t1
                LEFT JOIN "
    .USER." t2 ON t2.id = t1.user_id
                LEFT JOIN "
    .profil." t3 ON t3.user_id = t1.user_id            
                GROUP BY t1.id
                ORDER BY nickname2 ASC, nickname ASC 
    Aber so funktioniert es ja nicht ganz.:/
    Gut geraten ist halb gewußt.

  • #2
    Was steht denn in nickname2?

    Kommentar


    • #3
      ORDER BY nickname ASC, other_column DESC, and_another ASC, ....

      Es ist sinnlos, als sekundäres Sortierkriterium eine Spalte zu erzeugen, die immer leer ist, denn dann ist klar, dass alle Tupel in dieser Spalte den selben Wert (nämlich keinen) haben und keine Sortierfolge entstehen kann.


      (Davon abgesehen dürfte "SELECT t3.nickname != '' AS nickname2" syntaktisch falsch sein.)
      Zuletzt geändert von onemorenerd; 19.11.2007, 13:46.

      Kommentar


      • #4
        ???
        EDIT:
        Aha, es gibt auch noch ne Erklärung...
        Zuletzt geändert von TobiaZ; 19.11.2007, 13:51.

        Kommentar


        • #5
          Das mit der dekundären sortierung leuchtet mir jetzt auch ein.

          nickname2 sollte nickname sein nur keine leeren nickname Felder.
          Ja, es ist syntacktisch falsch. War nur ein Beispiel.
          Aber wie heißt denn eine Funktion, auf der ich sowas wie (t3.nickname != '') anwenden kann?
          Gut geraten ist halb gewußt.

          Kommentar


          • #6
            SELECT
            IF(nickname="",1,0) leer
            ORDER BY
            leer

            Kommentar


            • #7
              Aha, danke.
              Gut geraten ist halb gewußt.

              Kommentar


              • #8
                Und wenn man so etwas noch verfeinern möchte?
                Zum Beispiel nur die Nicknamen, die auch sichtbar sein sollen.

                SELECT
                IF (nickname_show == 1) AND (nickname="",1,0) leer
                ORDER BY
                leer

                Oder wie gebe ich eine AND Anweisung in diesem Zusammenhang mit an?
                Gut geraten ist halb gewußt.

                Kommentar


                • #9
                  Nee,

                  Die Bedingung muss natürlich wie gehabt "hinter" WHERE. Das hat im SELECT nichts zu suchen...

                  Kommentar


                  • #10
                    Ach stimmt.
                    Da ich ja eh (nickname="",1,0) leer
                    also leer neu definiere wird das Ergebnis ja denn nicht beeinflusst.

                    Danke.
                    Gut geraten ist halb gewußt.

                    Kommentar


                    • #11
                      Ach, ne. Die Ergebnismenge wird ja doch beeinflusst.
                      Die Anzahl soll ja gleich bleiben.
                      Nur sollen die Ergebnisse zuerst ausgegeben werden, wo der Nickname gesetzt ist und dann alpabetisch sortiert.

                      IF(t3.nickname_show=1, (t3.nickname='',1,0) leer, 0)

                      Also eine geschachtelte Abfrage in MySql haut so nicht hin, wie sie sollte.

                      Muß ich das so lösen:
                      SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; ?
                      Denn müßte ich aber "leer" in beiden definieren oder wie?
                      Gut geraten ist halb gewußt.

                      Kommentar


                      • #12
                        Kannst du bitte nochmal sagen, was dein soll und dein ist-zustand ist?

                        Bisher gehen wir davon aus, dass du eine Menge von Mitgliedern hast, einige davon haben einen "nickname" angegeben, bei anderen ist dieses Feld leer.

                        Nun sollen alle zurück gegeben. Dabei sollen zuerst die mit "nickname" alphabetisch sortiert und danach der rest "ohne" "nickname" zurückgegeben werden.

                        Das haben wir geschafft.

                        Zum Beispiel nur die Nicknamen, die auch sichtbar sein sollen.
                        Das ist für mich Keine Aussage.

                        Willst du nur die Nicknames anzeigen, die auch sichtbar sein wollen, also z.B. das Feld "nickname_show" = 1 haben?

                        Dann bist du natürlich mit WHERE nickname_show = 1 an der Richtigen stelle.

                        Alternativ könntest du meinen, dass du weiterhin alle User zurükgeben willst, aber bei denen die einen nickname habe, willst du prüfen, ob dieser auch angezeigt werden darf, ansonsten willst du den eintrag bei den anderen "leeren" nicknames (nicht) anzeigen.

                        hierzu wäre

                        IF(nickname_show = 1,nickname,"")

                        hilfreich. Wüsstest du, wenn du das erste IF() verstanden hättest.

                        im nächsten schritt muss du nur logisch verschachten:

                        IF(IF(nickname_show = 1,nickname,"")="",1,0) leer

                        Kommentar


                        • #13
                          Gegeben:
                          nickname_show = 1 oder 0
                          und
                          nickname = Ist der Nickname, wenn er gesetzt wurde

                          Ich wollte alle User ausgeben.

                          Aber sortiert. Zuerst alle die nickname_show=1 und nickname nach Alpabet.

                          Ich glaube das:
                          IF(IF(nickname_show = 1,nickname,"")="",1,0) leer
                          sieht ganz brauchbar aus.
                          Versuche ich mal einzubauen.
                          Danke

                          Mit sonen IF Abfragen in Mysql kann man sich eine Menge Arbeit sparen.
                          Gut geraten ist halb gewußt.

                          Kommentar


                          • #14
                            Die Lösung:

                            IF(IF(t3.nickname_show = 1,t3.nickname,'')='',1,0) leere_nicknamen
                            ORDER BY leere_nicknamen ASC, nickname ASC


                            Ohh Man^^
                            Gut geraten ist halb gewußt.

                            Kommentar


                            • #15
                              eigentlich ganz einfach,

                              Kommentar

                              Lädt...
                              X