Duras666: MySQL-abfrage... wie muss ichs machen?

Hi zusammen!

Habe folgende tabelle:
+--+--------+-------+----+-----+
|id|tothread|forumid|byid|datum|
+--+--------+-------+----+-----+
| 1|       1|      1|   7| egal|
+--+--------+-------+----+-----+
| 2|       1|      1|   7| egal|
+--+--------+-------+----+-----+
| 3|       2|      1|   7| egal|
+--+--------+-------+----+-----+
| 4|       3|      5|   7| egal|
+--+--------+-------+----+-----+
Will jetzt eine abfrage machen bei der folgendes rauskommt:

3 Zeilen (WHERE forumid = '1') mittels mysql_affected_rows()
anzahl der unterschiedlichen werte bei tothread (also 1,2 -> demnach 2)
die felder id, tothread, byid, datum
hatte es so versucht:
SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY id

funktioniert auch so weit: die felder werden ausgelesen, 3 zeilen, NUR:
count(DISTINCT(tothread)) as threads  ergibt immer 1, obwohl da doch 2 unterschiedliche zeilen drin sind :(

wer kann helfen?

  1. yo,

    SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY id

    funktioniert auch so weit:

    das ist zufall, dass keine fehlermeldung kommt. benutzt du aggregat funktionen wie count in der SELECT klausel, dann sollten zwingend alle anderen nicht aggregat spalten in der GROUP BY klausel mit angegeben werden.

    count(DISTINCT(tothread)) as threads  ergibt immer 1, obwohl da doch 2 unterschiedliche zeilen drin sind :(

    da du nach id gruppierts, erzeugtst du für jeden datensatz eine gruppe un der count dicstinct bezieht sich jeweils nur auf diese gruppe, wobei eben immer nur ein datensatz der gruppe zugeorndet sit, da es sich ja höchst wahrshceinlich um den primary key handelt.

    Ilja

    1. das ist zufall, dass keine fehlermeldung kommt. benutzt du aggregat funktionen wie count in der SELECT klausel, dann sollten zwingend alle anderen nicht aggregat spalten in der GROUP BY klausel mit angegeben werden.

      also so: SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY id, tothread, byid, datum, tothread ???

      da du nach id gruppierts, erzeugtst du für jeden datensatz eine gruppe un der count dicstinct bezieht sich jeweils nur auf diese gruppe, wobei eben immer nur ein datensatz der gruppe zugeorndet sit, da es sich ja höchst wahrshceinlich um den primary key handelt.

      ja, is primary key!

      1. yo,

        also so: SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY id, tothread, byid, datum, tothread ???

        so ist es syntaktisch richtig, führt aber nicht zu dem ergebnis, was du haben willst. du solltest überhaupt nicht nach id gruppieren, da dusonst immer nur einen datensatz pro gruppe erhällst. dein count und distinct ist der richtige ansatz, aber du musst dir noch mal überlegen, wonach genau du gruppierst.

        Ilja

        1. yo,

          also so: SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY id, tothread, byid, datum, tothread ???

          nachtrag, habe zu schnell gelesen. die aggregatfunktion brauchen nicht in die group by klausel.

          Ilja

          1. nachtrag, habe zu schnell gelesen. die aggregatfunktion brauchen nicht in die group by klausel.

            demnach:
            SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY tothread, id, byid, datum

            Group by tothread, weil ich ja die gruppen an tothread haben will
            (egal, ob ich es jetzt auch im count benutze oder nicht...)

            1. hab auch zu schnell gelesen :)

              also so:
              SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY tothread

              SELECT id, tothread, byid, datum, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY tothread, id, byid, datum

              Group by tothread, weil ich ja die gruppen an tothread haben will
              (egal, ob ich es jetzt auch im count benutze oder nicht...)

              1. habs gerade mal eingesetzt... scheint leider net zu funzen!

                -> count(DISTINCT(tothread)) ergibt trotzdem 1, mysql_affected_rows() ergibt 2... nun ja, jetzt weiss ich wenigstens, wie ich die anzahl der unterschiedlichen tothreads rausfinde... group BY und dann mysql_affected_rows() :) hab ich aber immer noch nicht die anzahl der einträge insgesammt... ich denke, so im nachhinein werd ich um die 2. SQL-anweisung nicht herrumkommen :(

                schade!

                mfg
                Duras

                PS: sorry für die vielen posts!

                1. yo,

                  .. ich denke, so im nachhinein werd ich um die 2. SQL-anweisung nicht herrumkommen :(

                  doch das kannst du, du musst nur verstehen, was Aggregat funktionen und GROUP BY macht und ob du es überhaupt brauchst. fang doch einmal klein ein, und mache die abfrage ohne GROUP BY.

                  SELECT count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]'

                  damit bekommst du erst einmal deine anzahl. falls überhaupt erwünscht, GROUP BY Schritt für Schritt mit einarbeiten und sehen was rauskommt, zum Beispiel:

                  SELECT forumid, count(DISTINCT(tothread)) as threads FROM foren_posts GROUP BY forumid;

                  SELECT forumid, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY forumid;

                  etc.

                  Ilja

                  1. hmmm...

                    doch das kannst du, du musst nur verstehen, was Aggregat funktionen und GROUP BY macht und ob du es überhaupt brauchst. fang doch einmal klein ein, und mache die abfrage ohne GROUP BY.

                    nun ja, was count macht weiss ich, was group by mach weis ich auch!

                    SELECT count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]'

                    das seh ich ja ein :)

                    damit bekommst du erst einmal deine anzahl. falls überhaupt erwünscht, GROUP BY Schritt für Schritt mit einarbeiten und sehen was rauskommt, zum Beispiel:

                    SELECT forumid, count(DISTINCT(tothread)) as threads FROM foren_posts GROUP BY forumid;

                    SELECT forumid, count(DISTINCT(tothread)) as threads FROM foren_posts WHERE forumid = '$row2[id]' GROUP BY forumid;

                    warum group by forumid? wenn ich das mache und dann mit der WHERE-beschänkung arbeite habe ich doch nur eine Gruppe! nämlich genau die, wo forumid = $row2[id]! und damit komme ich doch bei dem count nur auf eine reihe! des weiteren nimmt er dann ja IRGEND EINE reihe aus der Gruppe... was ja auch wieder nicht gewünscht ist!