mysql count() oder sum()

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

  • mysql count() oder sum()

    hallo,

    ich wuerde gerne aus verschiedenen tabellen die eintraege zusammen zaehlen lassen.. das problem ist nur das es 8 verschiede tabellen sind und ich moecht natuerlich nicht 8 db_query's machen, sondern nur 1 query.

    versucht hatte ich es mit : count($message), sum($message) from email1,email2,email3 ..... natuerlich kam eine fehler meldung..

    kann mir jemand mit einem beispiel zeigen wie dieses geht, ob es ueberhaupt geht? ... das als ergebnis dann alle $message felder zusammen gezaehlt werden...

    vielen dank!
    Zuletzt geändert von dESIGN; 28.06.2002, 09:28.

  • #2
    Kann man das nciht vielleicht wie einen verschachtelten select machen.
    Habs noch nicht probiert und hab in der Arbeit auch nciht die Möglichkeit es zu probieren, aber es könnt dcoh klappen
    ASP SuXs

    Kommentar


    • #3
      eigentlich müßte es so gehen, hatte aber auch noch keine Zeit es zu testen:

      SELECT sum(a.[Spaltenname]), sum(b.[Spaltenname]) FROM [Tabellenname1] a, [Tabellenname2] b;

      damit weist Du den Tables in der From-Klausel einen Alias zu, auf den Du vorne im SELECT zugreifen kannst.

      Kommentar


      • #4
        hey, erstmal danke fuer die schnellen antworten!

        @p2oldie
        leider bekomme ich folgende fehler-ausgabe:
        // Warning: Supplied argument is not a valid MySQL result resource //

        keine ahnung woran es liegt ... vielleicht funzt es ja so nicht wie ich es gemacht habe..

        //
        mysql_select_db(meinedb) or die("Can't select database!");
        $summe = mysql_query("SELECT sum(a.[post]), sum(b.[post]) FROM [mail] a, [mail] b");
        $ergebnis = mysql_result($summe,0);
        //

        ..

        Kommentar


        • #5
          hehe, sorry hab mich unklar ausgedrückt

          die [ ] vor dem post und bei den Tabellennamen sollten das nur als Platzhalter anzeigen. Wenn Du die eckigen Klammern rauswirfst, funzt es.

          Es ist aber Absicht, daß Du im FROM-Teil zweimal dieselbe Tabelle angegeben hast oder?

          Kommentar


          • #6
            hehe, oupss, yep stimmt funzt..

            eh mit den mail tabellen, stimmt.. war'n fehler von mir... *gruebel* Danke nochmals!

            Kommentar


            • #7
              okay, soweit funktioniert die abfrage... nur wenn ich sum() nehme ,bekomme ich 0 als ausgabe ... wenn ich count() nehme ,bekomme ich die anzahl der eintraege von tabelle 1 multipliziert mit den eintraegen der tabelle 2 .. sprich tabelle 1 hat 7 eintrage und tabelle 2 hat 2 eintraege..

              woran liegt das?

              das ist mein query:

              $query = mysql_query("SELECT sum(a.eintrag), sum(b.eintrag) FROM subdir a, subdir2 b");
              $result = mysql_result($query,0);
              echo "$result";
              Zuletzt geändert von dESIGN; 28.06.2002, 13:16.

              Kommentar


              • #8
                so, bin jetzt zu Hause, hab das nochmal ein bißchen getestet...
                bei mir liefert sum() und count() die gleichen Ergebnisse, anscheinend werden die Abfragen aber nacheinander ausgeführt.

                Habe testweise 3 Table mit jeweils 2 Einträgen angelegt, T1 (1, 1); T2 (1, 1); T3 (1, 1)

                Es wäre also zu erwarten, das bei einzelnen sum() jeweils 2 rauskommt => funktioniert.

                Beim verbinden von 2 Tables kommst jeweils 4 heraus => sum(T1) * sum(T2) oder sum(T1) + sum(T2)

                bei 3 Tables könnte also 6 rauskommen (wäre ja richtig), oder halt 8 (falls multipliziert wird).
                => sum(T1) * sum(T2) * sum(T3) = 8

                es wird also (aus einem mir nicht bekannten Grund) multipliziert. Werde mir nochmal die MySQL-Doku reinziehen, und gucken ob ich noch was dazu finde.

                Hier noch mal das Ergebnis der oben aufgelisteten Abfragen:

                mysql> select sum(zahl) from t1;
                +-----------+
                | sum(zahl) |
                +-----------+
                | 2 |
                +-----------+
                1 row in set (0.00 sec)

                mysql> select sum(a.zahl), sum(b.zahl) from t1 a, t2 b;
                +-------------+-------------+
                | sum(a.zahl) | sum(b.zahl) |
                +-------------+-------------+
                | 4 | 4 |
                +-------------+-------------+
                1 row in set (0.00 sec)

                mysql> select sum(a.zahl), sum(b.zahl), sum(c.zahl) from t1 a, t2 b, t3 c;
                +-------------+-------------+-------------+
                | sum(a.zahl) | sum(b.zahl) | sum(c.zahl) |
                +-------------+-------------+-------------+
                | 8 | 8 | 8 |
                +-------------+-------------+-------------+
                1 row in set (0.00 sec)

                ich meld mich, sobald ich was gefunden hab.

                Kommentar


                • #9
                  @P2oldi

                  buah, das waere extrem nett ... man koennte es ja loesen indem man 8 queries (jeder sum() == 1 query) .. nur waere das wohl der untergang fuer die datenbank.. (joke) ...



                  Kommentar


                  • #10
                    ich weiß woran es liegt, ich bastel noch mal eben das Statement richtig zusammen, das hakt noch etwas und editier das dann hier rein.

                    /edit
                    ich weiß nicht warum, aber MySQL kennt wichtige JOIN-Operatoren nicht (full outer z.B.) darum bekomme ich es nicht gebacken

                    andere Sache: sum() ist sowieso totaler Schwachsinn, da DU ja die Anzahl willst, nicht die Summe Muß also count() sein; darum hast Du anfangs auch 0 rausbekommen, wenn Du sum() benutzt hast.

                    Frage: hast Du in Deinen Tabellen eine Spalte, wo für jeden Datensatz z.B. eine ID gespeichert wird?
                    Wenn nicht, wäre das eine sehr viel einfachere Möglichkeit. Du könntest diese Spalte dann entweder auf "auto-increment" stellen, oder beim Insert hochzählen, dann müßtest Du nur die letzte Zeile (bzw. die höchste ID selektieren).

                    Kannst mich sonst auch per Mail oder ICQ erreichen, das ist vielleicht einfacher.

                    Gruß P2oldi
                    Zuletzt geändert von P2oldi; 28.06.2002, 16:12.

                    Kommentar


                    • #11
                      yep, 'id' mit auto-increment ist vorhanden.. nur wie bekomme ich den letzen eintrag der tabelle? .. und wie kann ich dann mit einem query alle 8 tabellen ansteuern und jeweils den letzten datensatz bekommen? ..sorry, einzel query's sind easy, aber soetwas hab ich bisher noch nicht gemacht...

                      *gruebel*

                      Kommentar


                      • #12
                        na das ist ja dann einfach

                        SELECT max(t1.id), max(t2.id),.... FROM t1, t2, .....

                        das liefert Dir die höchsten IDs (sprich die ID des letzten Datensatzes, also die Anzahl). Funktioniert allerdings nur, wenn Du nichts löscht, bzw. die gelöschten IDs wiederverwendets

                        Kommentar


                        • #13
                          oje, so simple kann es sein.. hehe..

                          ja ich hab's jetzt so gemacht:

                          select max(t1.id) + max(t2.id) FROM ...

                          und es klappt 100 pro jetzt... vielen Dank fuer deine Muehe @P2oldi! ..hast mir echt geholfen.


                          Kommentar


                          • #14
                            kein Problem, gern geschehen

                            paß halt nur auf, daß Du keine IDs löscht, dann geht's nicht mehr... (siehe letztes Posting).

                            mir fällt aber grad noch was anderes ein

                            Du kannst auch eine beliebige Spalte aus allen Tabellen selektieren, und dann mit
                            $anzahl = mysql_num_rows($result);

                            die Anzahl der Zeilen bekommen.

                            Kommentar


                            • #15
                              mysql_num_rows() waere auch mal eine alternative.. muss ich mal probieren.. ist vielleicht noch effektiver als max() ..den Du hast vollkommen recht, wenn ich eine .id loesche .. ist alles kaputt *g* .. mal sehen..

                              +oO(^_^)Oo+

                              Kommentar

                              Lädt...
                              X