SQL - Count
Giovanni Rena
- datenbank
Hallo,
hab eine Splate in einer Tabelle (Daten) die so aussieht:
Benutzer1, Benutzer2
Benutzer2, Benutzer4,
Benutzer1, Benutzer2, Benutzer3
Benutzer1
Benutzer2
Benutzer5,
Benutzer3, Benutzer2
Benutzer2, Benutzer1
...
in einer anderen Tabelle (Mitglieder) hab ich alle vorhandenen Benutzer
Benutzer1
Benutzer2
Benutzer3
Benutzer4
Benutzer5
...
Ich muß nun die Anazhl der Vorkommen der einzelnen Benutzer in der Tabelle Daten zählen, so dass es am Ende so aussieht:
Benutzer1 5x
Benutzer2 4x
Benutzer3 3x
Benutzer4 3x
Benjtzer5 1x
Aber ich bekommte das per SQL einfach nicht hin.
SELECT daten.Fotographen, Count(*)
FROM daten, mitglieder
WHERE mitglieder.Name in
(
select daten.Fotographen
from daten
)
Group by Fotographen
Das Problem ist, dass dabei irgedwie ein Kreuzprodukt teilweise erzeugt wird. Bekomms nicht hin, hoffe ihr könnt mir helfen!
Danke im Voraus
Gruß Giovanni
Hi Giovanni
hab eine Spalte in einer Tabelle (Daten) die so aussieht:
Benutzer1, Benutzer2
Benutzer2, Benutzer4,
Benutzer1, Benutzer2, Benutzer3
[..]
Da liegt das Problem. Diese Spalte verletzt die erste Normalform. Sie sagt (unter anderem) aus, das pro Spalte nur ein Wert vorkommen soll. Lösen kannst du das über eine Verbindungstabelle:
Du hast in dieser Tabelle 2 Spalten: BenutzerID und Schlüssel der Tabelle aus der die oben genannte Spalte kommt.
Mit diesem Datenbankdesign kannst du dann sehr einfach mit count() und Group By die entsprechenden Daten erzeugen.
Gruss Daniela
Ja, ich weiß dass das Design gegen die erste Normalform verstößt, aber das Problem ist
// Liste aller Namen erstellen
SELECT DISTINCT Name FROM mitglieder
// Schleife starten und mit vorher abgefragen Namen durchlaufen lassen
SELECT Count(*)
FROM daten
WHERE daten.Fotographen like '%ListeAllerNamen%'
Hi Giovanni
// Liste aller Namen erstellen
SELECT DISTINCT Name FROM mitglieder// Schleife starten und mit vorher abgefragen Namen durchlaufen lassen
SELECT Count(*)
FROM daten
WHERE daten.Fotographen like '%ListeAllerNamen%'
Argl. Das funktioniert zwar, aber die Performance... Du machst damit pro Mitglied einen Fulltablescan auf die Daten. Mit % am Anfang, kann dir kein DBMS einen Index benutzen. Wenn es wirklich nicht geht, das Design zu ändern, kannst du dir ja Fulltextindizes ansehen.
- ich weiß nicht wieviel Benutzer pro Eintrag nebeneinander stehen können, 2 oder soagar 8 ???
Wofür brauchst du das zu wissen bei meinem Ansatz? Pro Verbindung hast du einen Eintrag in der Verbindungstabelle, also 2 - 8 oder auch noch mehr.
Gruss Daniela
Also ich hab dann 2 Tabellen
Tabelle: Daten
Tabelle: Mitglieder
Die Tabelle Mitglieder würde dann so aussehen
ID / Mitglied
----------------
1 Benutzer1
2 Benutzer2
3 Benutzer3
4 Benutzer4
5 Benutzer1, Benutzer2
6 Benutzer1, Benutzer3
7 Benutzer1, Benutzer4
...
oder?
Hi Giovanni
[..]
Argl, nein, blos nicht, das ist ja noch schlimmer.
Du hast 3 Tabellen, deine beiden ursprünglichen wobei die eine Spalte entfernt wird. Eine neue Tabelle legst du zusätzlich an:
Verbindungstabelle
(ID), DatenID, MitgliederID
---------------------------
1 1 1
2 1 3
3 2 1
4 2 2
5 2 4
...
Gruss Daniela
Aua! Ich steh in die Ecke und schäm mich jetzt 10 Minuten!
Klar, aber dass dauert zu lange dass zu ändern. Hab jetzt die Lösung mit mehreren Selects umgesetzt und dann einfach ein rsort mit php und dann wars. Sind in dem Fall nicht so viele Abfragen, da gehts. Trtozdem danke!
Gruß Giovanni