SQL: Zählen von "Textstücken"

KingHoli

Lt. Commander
Mitglied seit
30.04.2002
Beiträge
106
Renomée
1
Standort
Köln
Moin zusammen...

Folgende Situation:

Eine Datenbank mit 2 Tabellen
Spalten in Tabelle1: User, Gruppenangehörigkeit
Spalten in Tabelle2: Gruppenname, AnzahlMitglieder

Jetzt besteht in Tabelle1 die Möglichkeit (per Auswahl) dem User eine Gruppe zuzuweisen. (Das funktioniert auch soweit)

Und jetzt das Problem:
In Tabelle2 soll "AnzahlMitglieder" automatisch ermittelt werden. Es soll dabei die Tabelle1 durchsucht und gezählt werden, wie oft in der Spalte "Gruppenangehörigkeit" der jeweilige "Gruppenname" steht.
Und natürlich soll das Ergebnis dann auch hinter dem "Gruppennamen" in der Spalte "AnzahlMitglieder" eingetragen werden.

Wenn ichs irgendwie "programmiertechnisch" beschreiben sollte würde das vermutlich so aussehen:
Code:
Tabelle2.Zeile1.AnzahlMitglieder = Anzahl (Tabelle1.Gruppenangehörigkeit = Tabelle2.Zeile1.GruppenName)
Tabelle2.Zeile2.AnzahlMitglieder = Anzahl (Tabelle1.Gruppenangehörigkeit = Tabelle2.Zeile2.GruppenName)
Tabelle2.Zeile3.AnzahlMitglieder = Anzahl (Tabelle1.Gruppenangehörigkeit = Tabelle2.Zeile3.GruppenName)
-
-
-
Tabelle2.ZeileXXX.AnzahlMitglieder = Anzahl (Tabelle1.Gruppenangehörigkeit = Tabelle2.ZeileXXX.GruppenName)

Ich hab mich schon ein wenig mit Google rumgeschlagen, aber irgendwie komme ich da zu nichts vernünftigem.
Und "wilde Rumklickerei" in Access hat mich auch zu nichts gebracht.
Hoffe ihr versteht was ich will ;)
 
Hmm, eigentlich müsste es so gehen:
Code:
UPDATE Tabelle2 LEFT JOIN (
  SELECT Tabelle1.Gruppenangehörigkeit AS GrpName, COUNT( Tabelle1.User ) AS Anzahl
  FROM Tabelle1, Tabelle2
  WHERE Tabelle2.Gruppenname = Tabelle1.Gruppenangehörigkeit
  GROUP BY Tabelle1.Gruppenangehörigkeit
) AS tmp ON Tabelle2.Gruppenname = tmp.GrpName
SET Tabelle2.AnzahlMitglieder = tmp.Anzahl
Geht aber nicht (Syntax Error).*noahnung*

*kopfkratz

/edit: Liegt glaube ich daran, dass meine MySQL-Version keine verschachtelten Abfragen mag. Wenn ich die innere Abfrage durch eine entsprechende Tabelle ersetze, geht es.
 
Straft mich Lügen, aber ich bin der Meinung, dass MySQL solche Verschatelten Abfragen wirklich nicht kann! SQL und MS SQL können das aber glaube ich!

Aber dein QUelltext sollte soweit richtig sein, also wenn du wirklich SQL (oder MS SQL) nutzt, dann probier einfach mal den Code von TiKu
 
So was mit nem Update zu machen ist mehr schlecht als recht. Denn bei jeder Änderung musst du das Update fahren.

Ich würde da einen View empfehlen und soweit ich weiß kann das selbst mysql in der neusten version (wie es mit der 4.x aussieht weiß ich nicht)

Also etwas a la:
Code:
CREATE VIEW GruppenStatistik (gruppe, anzahl_mitglieder) AS
SELECT Gruppenangehörigkeit, count(*) FROM Tabelle1
GROUP BY Gruppenangehörigkeit
ORDER BY count(*) DESC
 
Also eigentlich nutze ich einfach nur Access und wollte ne Abfrage gestalten...

und habe nach SQL-Code gefragt, weil Access die Möglichkeit bietet das per SQL-Code einzugeben...

ich werd nachher noch mal nen bissel rumprobieren... und melde mich anschließend wieder...

Danke schon mal für die Ratschläge
 
Wenn es nur um ne Abfrage geht, lass die erste Zeile weg:

Code:
SELECT Gruppenangehörigkeit, count(*) FROM Tabelle1
GROUP BY Gruppenangehörigkeit
ORDER BY count(*) DESC

Btw:
Klar gibt es SQL, nur leider kann nicht jede Implementierung alles aus dem Standard und manche können weniger als andere.
Man muss also immer schauen (wenn man nicht postgresql :D oder eine der kommerziellen (Oracle, IBM, MS SQL, ...) nimmt, ob bestimmte Features da sind.
Ok, Access ist wieder was anderes ;) Aber wenn es nur um ne simple Abfrage mit Aggregation geht wie oben sollte das ohne Probleme gehen
 
Zuletzt bearbeitet:
Hmm...

also von der Syntax her scheinen die Abfragen richtig zu sein... Allerdings spucken die mir nicht die Anzahl der User aus, die einer Gruppe angehören, sondern die in Tabelle1 eingetragenen Gruppennamen.

Und das auch nicht automatisch.. es steht dann in dem Feld wo ich eigentlich die Mitgliederzahl haben will nichts drin und wenn ich reinklicke bekomm ich die Auswahlmöglichkeit zwischen den Gruppen...
 
Das klingt nach einem Access-seitigen Problem, da kann ich die leider nicht weiterhelfen.

Bei der Abfrage oben stehen danach jede Wert der Spalte Gruppenzugehörigkeit einmal da und dahinter die Anzahl der Zeilen (= der User), die diese Gruppenzugehörigkeit haben.
 
Bei der Abfrage oben stehen danach jede Wert der Spalte Gruppenzugehörigkeit einmal da und dahinter die Anzahl der Zeilen (= der User), die diese Gruppenzugehörigkeit haben.

ahh... dann wird das wohl das Problem sein...

die Abfrage liefert also eine 2spaltige Tabelle

Gruppe1 | AnzahlGruppe1
Gruppe2 | AnzahlGruppe2
etc

oder hab ich jetzt was falsch verstanden?

In meiner Tabelle2 ist der Gruppenname schon fest vorgegeben (weil Tabelle1 ja daraus die Auswahlmöglichkeiten für den User zieht.

was ich jetzt moechte, ist dass in der Tabelle2 automatisch hinter jedem festen Gruppennamen eingetragen wird wie oft der in Tabelle1.Gruppenangehörigkeit vorkommt.

Sprich man muesste jetzt noch aus der (durch die Abfrage erzeugten) Tabelle die entsprechenden Anzahlen rausholen und in der Tabelle2 hinter den Gruppennamen kriegen (halt in das Feld Tabelle2.Anzahlmitglieder)..

wer weiß wie ich das noch hinkrieg?
 
die Abfrage liefert also eine 2spaltige Tabelle

Gruppe1 | AnzahlGruppe1
Gruppe2 | AnzahlGruppe2
etc

oder hab ich jetzt was falsch verstanden?
Nein, das hast Du richtig verstanden. Die innere Abfrage liefert eine solche zweispaltige Tabelle.
was ich jetzt moechte, ist dass in der Tabelle2 automatisch hinter jedem festen Gruppennamen eingetragen wird wie oft der in Tabelle1.Gruppenangehörigkeit vorkommt.

Sprich man muesste jetzt noch aus der (durch die Abfrage erzeugten) Tabelle die entsprechenden Anzahlen rausholen und in der Tabelle2 hinter den Gruppennamen kriegen (halt in das Feld Tabelle2.Anzahlmitglieder)..
Genau das macht die äußere Abfrage.
wer weiß wie ich das noch hinkrieg?
Mit der von mir geposteten Abfrage. Das Problem ist einfach nur, dass Low-End-Datenbanksysteme wie MS Access und MySQL nicht alle Features des SQL-Standards unterstützen und z. B. mit dem JOIN bei der Aktualisierungsabfrage oder mit der Verschachtelung nicht klar kommen.

Wie Georg schon schrieb, ist der Aufbau Deiner Datenbank suboptimal. Du solltest wirklich in Erwägung ziehen, das grundsätzlich anders zu lösen als über eine Aktualisierungsabfrage.
 
Zuletzt bearbeitet:
Was ich nicht verstehe ist, warum du unbedingt ne Tabelle dafür haben willst.
Du kannst doch bei Access, soweit ich weiß, Abfragen speichern.
Es ist doch absolut sinnlos, einen dynamischen Wert in eine (statische) Tabelle zu speichern. Dafür gibt es ja die Abfragen.
Und deine Formulare oder was auch immer du mit den Daten machen willst kannst du ja auf die Abfragen beziehen.

Ok, hab nochmal drüber nachgedacht:
Wenn du in Tabelle2 alle Gruppennamen hast (auch welche, wo noch keine User sind) macht folgende Abfrage Sinn:
Code:
SELECT Tabelle2.Gruppenname, count(Tabelle1.User)
FROM Tabelle2 LEFT JOIN Tabelle1 ON (Tabelle1.Gruppe = Tabelle2.Gruppe)
GROUP BY Tabelle2.Gruppenname
Aber halt als Abfrage, nicht als Tabelle. Die Anzahl gehört definitiv nicht in eine Tabelle!
 
Zuletzt bearbeitet:
Aber halt als Abfrage, nicht als Tabelle. Die Anzahl gehört definitiv nicht in eine Tabelle!
Okay... ich hab das Ganze jetzt via Abfragen implementiert. Man muss mich halt immer erst mit der Nase drauf drücken und dann erscheints ganz simpel ;)

Jetzt hab ich noch ne Gruppe mit dem Namen "keine" wie schließe ich diese explizit aus der Abfrage aus?

So sieht mein SQL-Code jetzt aus
Code:
SELECT Gruppe, count(*) AS Mitglieder
FROM Teilnehmer
GROUP BY Gruppe
ORDER BY count(*) DESC;
Was muss da nu wo hin, damit die Zeilen mit Gruppe = "keine" nicht im Ranking auftauchen?

Ach ja: und gibt es eine Möglichkeit nur die erste Zeile dieses "Rankings" mit der Abfrage auszugeben?
 
Zuletzt bearbeitet:
Case Sensetive:
Code:
SELECT Gruppe, count(*) AS Mitglieder
FROM Teilnehmer
WHERE Gruppe <> 'keine'
GROUP BY Gruppe
ORDER BY count(*) DESC;

Case Insensetive:
Code:
SELECT Gruppe, count(*) AS Mitglieder
FROM Teilnehmer
WHERE Gruppe NOT LIKE 'keine'
GROUP BY Gruppe
ORDER BY count(*) DESC;


Um nur die erste Zeile auszugeben, gibt es auf den unterschiedlichen SQL-Servern verschiedene Möglichkeiten. Bei MySQL ist es glaube ich "SELECT [...] LIMIT 1" und bei MSSQL "SELECT TOP 1 [...]".

Gruß,
BoMbY
 
Zuletzt bearbeitet:
Zurück
Oben Unten