small-step: COUNT in mehreren Tabellen in MySQL

Hi,

ich habe folgendes Problem:
ich möchte in mehreren Tabellen einen COUNT durchführen. Mit getrennten Abfragen klappt das auch gut, allerdings ist das wirklich ziemlich langsam (ich muss recht viele Abfragen in einer Schleife durchführen). Deswegen wollte ich das Zählen der Einträge auf eine Abfrage einschränken. Ich komme allerdings nicht wirklich weiter.

Also:
2 Tabellen, nennen wir sie der Einfachheit halber tabelle1 und tabelle2.
Aus tabelle1 benötige ich die Anzahl der Einträge bei denen die reporter_id = '$reporter_id' ist.
Aus tabelle2 benötige ich die Anzahl der Einträge bei denen die reporter_id = '$reporter_id' ist und bei denen active = '1' ist.

Versucht habe ich verschiedene Dinge, funktioniert hat bisher nichts.

SELECT
  COUNT(t1.id)
    AS 'count1',
  COUNT(t2.id)
    AS 'count2'
  FROM
    tabelle1 AS t1,
    tabelle2 as t2
  WHERE
    t1.reporter_id = '".$reporter_id."' OR
    t2.reporter_id = '".$reporter_id."' AND
    t2.active = '1'

oder

SELECT
  COUNT(t1.id)
  FROM tabelle1 AS t1
  LEFT JOIN tabelle2 AS t2
  ON t1.reporter_id = '".$reporter_id."'
  WHERE t2.reporter_id = '".$reporter_id."' AND
  t2.active = '1'

Aber ich schätze ich hab da was ziemlich falsch verstanden, hm?

Kann mir jemand auf den rechten Weg helfen?

Vielen Dank schonmal,
small-step

  1. Hi smallstep ,

    SELECT
      COUNT(t1.id)
      FROM tabelle1 AS t1
      LEFT JOIN tabelle2 AS t2
      ON t1.reporter_id = '".$reporter_id."'
      WHERE t2.reporter_id = '".$reporter_id."' AND
      t2.active = '1'

    sind t1.reporter_id und t2.reporter_id identisch?

    dann hilft bestimmt:

    SELECT
      COUNT(t1.id)
      FROM tabelle1 AS t1
      LEFT JOIN tabelle2 AS t2
      ON t1.reporter_id = t2.reporter_id
      WHERE t2.active = '1'

    ansonsten poste mal die Struktur der Tabellen, wie sie verbunden sind, was Du als Ergebnis erzielen willst und was bei den Versuchen für Ergebnisse rauskommen.

    ciao
    romy

    1. Hi romy,

      sind t1.reporter_id und t2.reporter_id identisch?

      Ja, sind sie. Allerdings sind dort viele verschiedene Nutzer vorhanden, deswegen muss ich noch nach der reporter_id selbst suchen.

      dann hilft bestimmt:

      SELECT
        COUNT(t1.id)
        FROM tabelle1 AS t1
        LEFT JOIN tabelle2 AS t2
        ON t1.reporter_id = t2.reporter_id
        WHERE t2.active = '1'

      ansonsten poste mal die Struktur der Tabellen, wie sie verbunden sind, was Du als Ergebnis erzielen willst und was bei den Versuchen für Ergebnisse rauskommen.

      Die Struktur wäre ein wenig viel, die beiden Tabellen umfassen jeweils ca. 15 spalten. Egal, hier ein Beispiel:

      tabelle1
      -----------------------------
      | id | reporter_id | inhalt |
      |---------------------------|
      | 1  | 12          | test1  |
      | 2  | 12          | test2  |
      | 3  | 7           | test3  |
      -----------------------------

      tabelle2
      --------------------------------------
      | id | reporter_id | active | inhalt |
      |------------------------------------|
      | 1  | 12          | 1      | test1  |
      | 2  | 12          | 0      | test2  |
      | 3  | 7           | 0      | test3  |
      --------------------------------------

      So, jetzt möchte ich die Anzahl der Einträge von reporter 12 aus tabelle1 haben. Das wären 2. Plus die Anzahl der Einträge aus tabelle2 bei denen der reporter ebenfalls 12 ist und active 1 ist, das wäre 1 Eintrag.

      Zusammenzählen kann ich das auch später, mir geht es erstmal um die jeweilige Anzahl.

      Gruß,
      small-step

      1. Hi small-step,

        tabelle1

        | id | reporter_id | inhalt |
        |---------------------------|
        | 1  | 12          | test1  |
        | 2  | 12          | test2  |
        | 3  | 7           | test3  |

        tabelle2

        | id | reporter_id | active | inhalt |
        |------------------------------------|
        | 1  | 12          | 1      | test1  |
        | 2  | 12          | 0      | test2  |
        | 3  | 7           | 0      | test3  |

        $ID sei 12

        SELECT
           COUNT(*)
           FROM tabelle1 AS t1
           INNER JOIN tabelle2 AS t2
           ON t1.reporter_id = t2.reporter_id
           WHERE t2.active = '1' AND t1.reporter_id = {$ID}

        sollte 3 liefern.
        idt active ein char-Feld? Ansonsten t2.active=1

        Kann leider nicht testen. Gehts ?

        ciao
        romy

        1. Hi romy,

          SELECT
             COUNT(*)
             FROM tabelle1 AS t1
             INNER JOIN tabelle2 AS t2
             ON t1.reporter_id = t2.reporter_id
             WHERE t2.active = '1' AND t1.reporter_id = {$ID}

          sollte 3 liefern.
          idt active ein char-Feld? Ansonsten t2.active=1

          ID ist eigentlich nur ein Dummy, ist ein varchar.

          Kann leider nicht testen. Gehts ?

          Seltsamerweise das selbe Problem das ich schon einmal hatte. Statt 1 bekomme ich 0, statt 4 bekomme ich 3 ausgegeben. 0 bleibt 0.

          Versteh ich nicht.

          Grüße,
          small-step

          1. hi,

            vielleicht hilft Dir das weiter:

            http://jinxidoru.com/tutorials/union.html

            Grüße Oesi