Ankündigung

Einklappen
Keine Ankündigung bisher.

ORDER BY 'count(id)'

Einklappen

Neue Werbung 2019

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

  • ORDER BY 'count(id)'

    Hallo,

    kann mir jemand von euch verraten, wie man in einer MySQL Abfrage
    nach einer bestimmten SpaltenAnzahl ordnen kann.

    Stelle mir das so vor:
    Code:
    "SELECT a.title, count(b.comment) AS comments 
       FROM content AS a
    LEFT JOIN comments AS b 
       ON b.content_id = a.id
    WHERE a.id =". (int)$id
    ." AND ....
    ORDER BY 'Anzahl der jeweiligen Kommentare'";
    Wie macht man das?
    Ich möchte das gerne in einer Abfrage belassen, da ich per Selekt
    Feld die Anordnung wechseln möchte.

  • #2
    Wenn du ein "ORDER BY 'count(id)'" machen möchtest, musst du einfach den Count in das SELECT mit aufnehmen, dieses aliasen und dann ein ORDER BY darauf machen.

    Code:
    "SELECT a.title, count(b.comment) AS comments
    FROM content AS a
    LEFT JOIN comments AS b ON b.content_id = a.id
    WHERE a.id =". (int)$id
    ." AND ....
    ORDER BY comments ASC|DESC;

    Kommentar


    • #3
      Ach so einfach geht das?
      Du hast natürlich recht, dass ich die ids zähle und nicht die Kommentare.
      Wieder was gelernt. Danke dir.

      Kommentar


      • #4
        Eine Frage hätte ich allerdings dazu noch.

        Nun habe ich alles so geregelt wie ich möchte. Das Problem ist allerdings, dass ein LEFT JOIN mir bei der Ordnung ein Problem beschert. Dort werden für ein Voting Anzahl der Stimmen und Summe der angegebenen Punkte nebst der contentid gespeichert. Das Problem ist wenn ich nach der Anzahl der Votingpunkte anordne, bleiben alle Inhalte die noch nie bewertet worden sind immer oben stehen, d.h. auch wenn ich absteigend ordne. Bewerte ich sie, reihen sie sich ein. Kann man da irgendetwas machen?

        Grüße
        Tine

        Kommentar


        • #5
          COUNT() zählt nur NOT NULL Werte, kannst dann Spalten oder Aliase mit IF (spalte IS NULL, 0, 1) auf einen gültigen, zählbaren und sortierbaren Wert setzen.

          Zitat von tinchen
          Das Problem ist wenn ich nach der Anzahl der Votingpunkte anordne, bleiben alle Inhalte die noch nie bewertet worden sind immer oben stehen, d.h. auch wenn ich absteigend ordne.
          Dann hast du nen anderen Seiteneffekt, NULL wird bei der Sortierung als kleinster Wert angesehen.

          Kommentar


          • #6
            Ich habe nun so einiges versucht, aber das Ergebnis bleibt beim Alten.
            Vielleicht kann sich das mal jemand ansehen und mir verraten was ich falsch mache.

            Code:
            SELECT a.id, a.title, a.hits, a.created_by, a.created AS created, a.access, u.name AS author, a.state, COUNT(c.id) AS comments, IF( (r.rating_sum/r.rating_count) IS NULL, 0, ROUND(r.rating_sum/r.rating_count)) AS vote, r.rating_count AS vote_count
             FROM content AS a
             LEFT JOIN users AS u ON u.id = a.created_by
             LEFT JOIN comments AS c ON a.id = c.contentid
             LEFT JOIN content_rating AS r ON a.id = r.content_id
             WHERE a.published = 1
             GROUP BY a.id
             ORDER BY vote
             LIMIT 50
            Ob ich nun ORDER BY vote oder ORDER BY vote DESC schreibe, die Inhalte, die nicht bewertet sind - ein LEFT JOIN impliziert ja nicht für jeden Datensatz, Daten in der referenzierenden Tabelle - bleiben einfach oben stehen. Das ist natürlich nicht gewollt, sondern die Inhalte sollen bei absteigender Sortierung unten stehen.
            Gibt es keine Kommentare für einen Inhalt werden die Inhalte für ORDER BY comments oder comments DESC so angeordnet wie gewünscht.

            Also ich verstehe das gerade leider überhaupt nicht.
            Wäre für Hinweise dankbar.
            Grüße
            Tine

            Kommentar


            • #7
              Ne Rechnung ist aber nie NULL, höchstens 0.
              (r.rating_sum/r.rating_count) IS NULL
              Verwende da mal eine Spalte (irgendeine).

              Kommentar


              • #8
                Laut MySQL Doku ergibt x/0 NULL für beliebige x.

                Auch diese Variante habe ich schon probiert. Die Inhalte, die unbewertet sind, bleiben oben stehen, egal ob nun absteigend oder aufsteigend nach vote geordnet.

                Also
                Code:
                IF(r.rating_count IS NULL, 0, ROUND(...))
                Alles wie zuvor. Wenn ich statt 0 eine 1 schreibe werden die Inhalte eingeordnet, aber das ist natürlich nicht mein Wunsch, keine Bewertung ist keine Bewertung.

                Kann dieser "Fehler" noch durch etwas anderes entstehen?
                Grüße
                Tine

                Kommentar


                • #9
                  /0 teilen ist ja auch nicht erlaubt, klingt daher logisch

                  kopier hier mal die struktur und ein paar dummy einträge, kann das gerade nich nachvollziehen

                  Kommentar


                  • #10
                    /0 teilen ist ja auch nicht erlaubt, klingt daher logisch
                    Erlaubt ist das schon, macht nur keinen Sinn. Andere Diskussion. :wink:

                    Nun habe ich mich zig Stunden damit befasst, zig mal den Debugger bemüht und trotzdem ist mir erst heute morgen ein Licht aufgegangen. Ich ärgere mich schon wieder so dermaßen, dass ich nicht trotz Ausgabe der query Strings nicht drauf gekommen bin. In dem switch für die Anordnung hatte ich warum auch immer an der Stelle für den break nach der Anordnung vote DESC back begeschrieben, was den switch natürlich veranlasst hat bis zum Defaultwert durchzulaufen, die bei zwei Einträgen gerade die Eigenschaft hat, die Ausgabe genauso zu ordnen wie ORDER BY vote ASC es vorgibt. Schön doof. Die Anordnung funktioniert auch mit dem Wert NULL genauso, egal ob per IF 0 gesetzt.

                    Vielen Dank für die Mühe.

                    Natürlich komme ich um eine Frage nicht rum. Nun habe ich trotzdem das IF Konstrukt verwendet und zwar um den Wert von NULL auf 0 zu setzen. Ich möchte die Ausgabe 0, wenn ich zum Beispiel die Anzahl der Kommentare anzeige. Ist es da sinnvoll das bereits per SQL zu machen oder kann man das auch per PHP machen? Einfache Funktion setzte 0, wenn empty oder so etwas.

                    Grüße
                    Tine

                    Kommentar


                    • #11
                      Zitat von tinchen
                      /0 teilen ist ja auch nicht erlaubt, klingt daher logisch
                      Erlaubt ist das schon, macht nur keinen Sinn. Andere Diskussion. :wink:
                      Da hat der Prozessor sogar nen Interrupt für, DivisionByZero. Aber mein mathematischer Horizont reicht nur bis zu den reelen Zahlen, geht das bei komplexen Zahlen etwa?

                      Zitat von tinchen
                      In dem switch für die Anordnung hatte ich warum auch immer an der Stelle für den break nach der Anordnung vote DESC back begeschrieben, was den switch natürlich veranlasst hat bis zum Defaultwert durchzulaufen
                      Ja fehlendes break; ist echt böse, hat ich auch schon viel Ärger mit

                      Zitat von tinchen
                      Natürlich komme ich um eine Frage nicht rum. Nun habe ich trotzdem das IF Konstrukt verwendet und zwar um den Wert von NULL auf 0 zu setzen. Ich möchte die Ausgabe 0, wenn ich zum Beispiel die Anzahl der Kommentare anzeige. Ist es da sinnvoll das bereits per SQL zu machen oder kann man das auch per PHP machen? Einfache Funktion setzte 0, wenn empty oder so etwas.
                      So ganz verstehe ich die Frage nicht, meinst du ob es mehr Sinn macht einen NULL-Wert von SQL oder von PHP auf 0 zu setzen?
                      Schneller ist es wohl mit SQL. Das musst aber du wissen, hauptsache du behältst die Übersicht über deinen Programmcode.

                      Kommentar


                      • #12
                        meinst du ob es mehr Sinn macht einen NULL-Wert von SQL oder von PHP auf 0 zu setzen?
                        Das habe ich gemeint. Wenn man das natürlich mit zig Werten macht ist das etwas unschön mit SQL, aber ich denke für zwei Werte ist es ok. Danke dir.
                        hauptsache du behältst die Übersicht über deinen Programmcode.
                        Manchmal.

                        Grüße
                        Tine

                        Kommentar


                        • #13
                          Bei zig-Werten würd ich der Performance zuliebe wahrscheinlich doch SQL nehmen.

                          Kommentar

                          Lädt...
                          X