Gustav: PHP/MySQL - Anzahl verschiedener Datensätze ermitteln.

Hallo,

ich stehe vor dem Problem, dass ich zwei Tabellen habe bei denen ich jeweils verschiedene Datensätze zählen möchte. Aber es ist für mich zu kompliziert. Ich habe versucht eine Lösung zu finden, aber es war nichts für mich dabei.

Ich habe Tabelle A und Tabelle B. In diesen Tabellen Speichere ich Nachrichten. A = Nachrichten_2012, B = Nachrichten_2013. Diese Nachrichten können die Eigenschaft Gelesen = 0 oder 1 besitzen.

Aus Tabelle A möchte ich nun alle Datensätze zählen die gelesen wurden und nicht gelesen wurden, bei Tabelle b das gleiche ohne 4 Abfragen machen zu müssen in dieser Art:

$Nachrichten = mysql_query("SELECT count(*) AS 2013Ungelesen FROM Nachrichten_2013 WHERE Adressat = '". $ID ."' AND Gelesen = 0");  
$Anzahl = mysql_fetch_assoc($Nachrichten);  
echo $Anzahl['2013Ungelesen'];

bzw.

  
$Nachrichten = mysql_query("SELECT count(*) AS 2013Gelesen FROM Nachrichten_2013 WHERE Adressat = '". $ID ."' AND Gelesen = 1");  
$Anzahl = mysql_fetch_assoc($Nachrichten);  
echo $Anzahl['2013Gelesen'];

Gibt es eine Möglichkeit, dass ich diese 4 Abfragen in einer SQL Abfrage herausfinden kann, um nicht immer ein neues mysql_query aufzumachen?

Zum Beispiel in der Art:
mysql_query("SELECT count(*) AS 2013Ungelesen FROM Nachrichten_2013 WHERE Adressat = '". $ID ."' AND Gelesen = 0, SELECT count(*) AS 2013Gelesen FROM Nachrichten_2013 WHERE Adressat = '". $ID ."' AND Gelesen = 1, SELECT count(*) AS 2012Gelesen FROM Nachrichten_2012 WHERE Adressat = '". $ID ."' AND Gelesen = 1,SELECT count(*) AS 2012Ungelesen FROM Nachrichten_2012 WHERE Adressat = '". $ID ."' AND Gelesen = 0");

Hab schon an sowas gedacht:
SELECT count(2013.Adressat) AS 2013Gelesen, count(2013.Adressat) AS 2013Ungelesen FROM Nachrichten_2013 2013 WHERE Adressat = '". $ID ."' AND Gelesen = 0 - Jedoch hätte das 2013Ungelesen den gleichen Wert wie 2013Gelesen, da ich keine Ahnung habe wie ich eine zweite WHERE Klausel einführen soll. Kann mir jemand ein Beispiel geben und es ggf. erläutern? Dafür wäre ich sehr verbunden.

Danke!
Euer Gustav.

Funktioniert natürlich nicht.

  1. Hi,

    Ich habe Tabelle A und Tabelle B. In diesen Tabellen Speichere ich Nachrichten. A = Nachrichten_2012, B = Nachrichten_2013.

    Daten gleicher Struktur gehören in ein und dieselbe Tabelle.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Daten gleicher Struktur gehören in ein und dieselbe Tabelle.

      So wird doch die Tabelle unendlich groß und das zugreifen auf die Datensätze würde doch länger brauchen.
      Anderseits ist das nicht alles. Ich habe auch noch eine Tabelle Systemnachrichten. Die Struktur ist wieder eine andere!

  2. Tach!

    Aus Tabelle A möchte ich nun alle Datensätze zählen die gelesen wurden und nicht gelesen wurden, bei Tabelle b das gleiche ohne 4 Abfragen machen zu müssen in dieser Art:

    SELECT count(*) AS 2013Ungelesen FROM Nachrichten_2013 WHERE Adressat = ? AND Gelesen = 0
    SELECT count(*) AS 2013Gelesen FROM Nachrichten_2013 WHERE Adressat = ? AND Gelesen = 1

    Dein Problem ist, ein passendes SQL-Statement zu finden. PHP hat damit nichts zu tun, also lass das bitte aus der Problembeschreibung raus.

    Die obigen beiden Abfragen lassen sich über 'GROUP BY Gelesen' zusammmenbringen. Weitere Tabellen lassen sich lediglich mit UNION anflanschen. Das bringt dir aber keinen großartigen Vorteil, weil es nur einen Roundtrip zum DBMS spart, die Querys aber trotzdem für jede Tabelle einzeln notiert werden müssen.

    Gibt es eine Möglichkeit, dass ich diese 4 Abfragen in einer SQL Abfrage herausfinden kann, um nicht immer ein neues mysql_query aufzumachen?

    Nur wenn du die gleichartigen Daten in nur einer Tabelle ablegst. Die Tabelle wird vielleicht sehr groß, aber nicht unendlich groß. Und ein DBMS ist auf die Verwaltung großer Datenmengen ausgelegt. Für ein schnelleres Finden helfen Indexe, die entsprechend der Abfragen angelegt werden.

    Mit nur einer Tabelle könnte man hier über das Jahr und Gelesen gruppiert zählen lassen.

    Zum Beispiel in der Art:
    SELECT count(*) AS 2013Ungelesen FROM Nachrichten_2013 WHERE Adressat = ? AND Gelesen = 0, SELECT count(*) AS 2013Gelesen FROM Nachrichten_2013 WHERE Adressat = ? AND Gelesen = 1, SELECT count(*) AS 2012Gelesen FROM Nachrichten_2012 WHERE Adressat = ? AND Gelesen = 1,SELECT count(*) AS 2012Ungelesen FROM Nachrichten_2012 WHERE Adressat = ? AND Gelesen = 0

    Es hilft dir nichts, mit Phantasie-Syntax ein Problem lösen zu wollen. Alles was syntaktisch geht, ist im MySQL-Handbuch beschrieben.

    dedlfix.