Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL: COUNT() bei Abfrage mehrerer Tabellen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] MySQL: COUNT() bei Abfrage mehrerer Tabellen

    Hallo zusammen,

    normalerweise habe ich keine Probleme mit SQL-Abfragen, aber in diesem Fall stehe ich total auf dem Schlauch.

    Ich habe zwei Tabellen, t1 und t2. In der Abfrage hole ich jeden Wert von t1 (t1.*). Zusätzlich möchte ich noch die Datensätze in t2 zählen, die mit dem aktuellen Datensatz aus t1 verbunden sind (t2.t1ID=t1.ID). Als Ergebnis habe ich nun alle Datensätze aus t1 und ein zusätzliches Feld mit der Anzahl der verknüpften Datensätze aus t2. Wie muss nun dieses SQL-Statement aussehen?


    Vielen Dank im Voraus
    John


  • #2
    Hi.

    Schon hier geschaut?

    SQLdocu - SQL Befehle - Abfrage ber mehrere Tabellen (JOINS)

    Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Zwischendurch mal eine mögliche Lösung...

      Code:
      CREATE TABLE t1 (
       t1_id INT NOT NULL,
       feld1 VARCHAR(10) NOT NULL,
       feld2 VARCHAR(10) NOT NULL
      );
      
      CREATE TABLE t2 (
       t2_id INT NOT NULL,
       t1_id INT NOT NULL, 
       feld3 VARCHAR(10) NOT NULL
      );
      
      INSERT INTO t1 VALUES
      ( 1, 'feld1-1','feld2-1'),
      ( 2, 'feld1-2','feld2-2'),
      ( 3, 'feld1-3','feld2-3');
      
      INSERT INTO t2 VALUES
      ( 1, 1, 'feld3-1'),
      ( 2, 1, 'feld3-2'),
      ( 3, 2, 'feld3-2');
      
      SELECT t1.*, t2.anzahl
        FROM t1
        JOIN ( SELECT t1_id, COUNT(*) AS anzahl
                 FROM t2
               GROUP BY t1_id ) t2
          ON t1.t1_id = t2.t1_id
      ORDER BY t1.feld1;
      
      +-------+---------+---------+--------+
      | t1_id | feld1   | feld2   | anzahl |
      +-------+---------+---------+--------+
      |     1 | feld1-1 | feld2-1 |      2 |
      |     2 | feld1-2 | feld2-2 |      1 |
      +-------+---------+---------+--------+
      2 rows in set (0.00 sec)
      
      mysql>
      
      SELECT t1.*, t2.anzahl
        FROM t1
        LEFT OUTER JOIN ( SELECT t1_id, COUNT(*) AS anzahl
                 FROM t2
               GROUP BY t1_id ) t2
          ON t1.t1_id = t2.t1_id
      ORDER BY t1.feld1;
      
      +-------+---------+---------+--------+
      | t1_id | feld1   | feld2   | anzahl |
      +-------+---------+---------+--------+
      |     1 | feld1-1 | feld2-1 |      2 |
      |     2 | feld1-2 | feld2-2 |      1 |
      |     3 | feld1-3 | feld2-3 |   NULL |
      +-------+---------+---------+--------+
      3 rows in set (0.00 sec)
      
      mysql>
      Grüße
      Thomas

      Kommentar


      • #4
        @Wolf29
        Vielen Dank für den Link, aber Funktionsweise von JOINS und COUNT() ist mir geläufig, der Fehler muss in irgendeinem Detail stecken.

        @Thomas
        Vielen Dank für Mühe die du dir gemacht hast. Ich habe es mit der ersten Abfrage probiert, aber wie schon meinen eigenen Versuchen erhalte ich nur die Fehlermeldung, dass es sich nicht um eine MySQL-Ressource handelt. Hier das Statement:

        $cSQL = "SELECT Tabelle1.*, Tabelle2.Anzahl FROM Tabelle1r JOIN (SELECT Tabelle2.UserID, COUNT(Tabelle2.*) AS Anzahl FROM Tabelle2 GROUP BY Tabelle2.UserID) Tabelle2 ON Tabelle1.ID = Tabelle2.UserID";

        Hab schon alles mögliche probiert, Verwendung von Aliases für die Tabellen, Anführungszeichen für das gesamte Statement...

        Wo ist der Fehler?

        Vielen Dank bis hier hin an euch beide...

        Kommentar


        • #5
          Die Fehlermeldung, dass es sich nicht um eine MySQL-Ressource handelt, sagt: Du hast einem Fehler im PHP-Skript. Der Fehler hat nichts mit der MySQL-Abfrage zu tun.

          Schau Dir mal Dir Grundlagen "siehe ganz oben hier in der Forumsmaske" zum Thema mysql_connect() etc. an oder zeige mal Dein PHP-Skript.

          Grüße
          Thomas

          Kommentar


          • #6
            Negativ, denn ich habe lediglich eine funktionierende SQL-Abfrage durch diese neue Abfrage ersetzt. Dabei tritt der Fehler auf. Die Infrakstruktur hat funktioniert und tut es immer noch. Es muss also an der Abfrage liegen, denn füge ich wieder die alte Abfrage ein, funktioniert es wieder...

            Grüße
            John

            Kommentar


            • #7
              Tja, wie Du oben gesehen hast, hat die Abfrage korrekt in der MySQL Console funktioniert.

              Bleibt nur die Chance, dass Du uns das PHP-Skriptteil zeigst, wenn der Fehler auftritt.
              Eventuell hat dieser Benutzer auch keine Zugriffsrechte auf die Tabellen.

              Grüße
              Thomas

              Kommentar


              • #8
                Zitat von John Steed Beitrag anzeigen
                $cSQL = "SELECT Tabelle1.*, Tabelle2.Anzahl FROM Tabelle1r JOIN (SELECT Tabelle2.UserID, COUNT(Tabelle2.*) AS Anzahl FROM Tabelle2 GROUP BY Tabelle2.UserID) Tabelle2 ON Tabelle1.ID = Tabelle2.UserID";
                Wo ist der Fehler?
                1) Heißt die Tabelle wirklich "Tabelle1r" ?
                2) COUNT(Tabelle2.*) ist falsch, es muss COUNT(*) lauten

                Grüße
                Thomas

                Kommentar


                • #9
                  $cSQL = "...";
                  $resResults = mysql_query($cSQL, $ConnectionID);
                  $numRows = mysql_num_rows($resResults); //HIER TRITT DER FEHLER AUF

                  Fehlermeldung: Supplied argument is not a valid MySQL result resource

                  ConnectionID ist ok, Benutzer hat die Rechte etc. ... Also muss irgend etwas an der Abfrage falsch sein. Liegt es vielleicht daran, dass es nicht zu jedem Datensatz aus Tabelle1 einen oder mehrere Datensätze aus Tabelle2 gibt?

                  Kommentar


                  • #10
                    Tabelle1r ist ein Typo, der bei der Anonymisierung der Tabellen passiert ist.
                    Mit COUNT habe ich beide Varianten ausprobiert...

                    Kommentar


                    • #11
                      Zitat von John Steed Beitrag anzeigen
                      $cSQL = "...";
                      $resResults = mysql_query($cSQL, $ConnectionID);
                      $numRows = mysql_num_rows($resResults); //HIER TRITT DER FEHLER AUF

                      Fehlermeldung: Supplied argument is not a valid MySQL result resource
                      Dann lohnt es sich, mal mysql_error() abzufragen.

                      PHP-Code:
                      $cSQL "...";
                      $resResults mysql_query($cSQL$ConnectionID);
                      if (!
                      $resResults ) {
                          die(
                      'Ungültige Abfrage: ' mysql_error());
                      }
                      $numRows mysql_num_rows($resResults); //HIER TRITT DER FEHLER AUF
                      [...]
                      ?> 
                      Grüße
                      Thomas

                      Kommentar


                      • #12
                        OK, ich habe die Lösung gefunden:

                        SELECT T1.*, COUNT(T2.ID) AS Anzahl FROM T1 LEFT OUTER JOIN T2 ON T1.ID=T2.UserID GROUP BY T1.ID

                        @Thomas
                        Deine Lösungen haben beim Betrachten mit der Funktion mysql_error() immer einen Syntaxfehler im SQL-Statement angezeigt, aus welchem Grund auch immer. Dennoch vielen Dank für deine Lösungsvorschläge.


                        Viele Grüße
                        John

                        Kommentar

                        Lädt...
                        X