mySQL: einzigartige Kombi Zählen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Wuppi
Mitglied
Beiträge: 732
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

mySQL: einzigartige Kombi Zählen

Beitrag von Wuppi »

Hi

ok der Betreff ist etwas - merkwürdig ;)

Ich habe eine Filmbestandsdatenbank auf basis von ofdbgw.org aufgebaut. Das ganze klappt soweit ganz gut - das Problem ist nur das bei den Schauspielern (vorwiegend bei asiatischen Filmen), viele Rollen von EINER Person abgedeckt sind (oder die Rollen unterschiedlich geschrieben werden). Ich möchte aber in meiner Zählung nur ermittelt haben das diese Person EINMAL in dem Film mitspielt.

Folgende DB "rollen"

personid = die ID aus der OFDB für diese Person
filmid = die Film-ID aus der OFDB
funktion = Darsteller, Regie usw.
name = Real-Name
rollenname = Name der Rolle

Ich hatte schon vor die einfach alles auf unique zu setzen und so doppelte Einträge zu vermeiden - das klappt aber nur bedingt:

Code: Alles auswählen

filmid personid	funktion	name		rollenname
1	10	Darsteller	Hans Wurst	Rolle1
1	10	Darsteller	Hans Wurst	Rolle_1
= gleiche Rolle, 2 schreibweisen (und das beim parsen schon entsprechend nachbearbeiten ist wegen der extrem vielen Varianten nicht möglich [alte asiatische Filme sind da der Horror]). Ich muß also mit diesem kleinen Fehler leben: "It's not a bug, it's a feature" [in der Personenübersicht werden die Filme alle aufgelistet]

Ich möchte aber in meiner Statistik diesen Fehler beheben

Für Film 1 wird Darsteller 10 jetzt 2x gezählt. Da soll aber nur 1 angezeigt werden. Hab deswegen viele asiatitische Schauspieler ganz oben in meiner Liste obwohl die nur in 3-4 Filmen mitspielen - werden aber 20-30x gezählt ;)

Meine bisherige Lösung:

Code: Alles auswählen

SELECT COUNT( * ) AS anz, personid, name FROM rollen WHERE funktion LIKE 'Darsteller' GROUP BY personid ORDER BY anz DESC, name ASC
Jetzt hatte ich mal Testweise:

Code: Alles auswählen

SELECT distinct personid, COUNT( name ) AS anz, name FROM rollen WHERE funktion LIKE 'Darsteller' and filmid=143138 GROUP BY persidofdb ORDER BY anz DESC
Ergebnis:

Code: Alles auswählen

personid	anz	name
6095		2	Ken Lo
18303		1	Tien Niu
6095 bekommt also 2 zähler.

Ich muß hier also einen anderen Ansatz versuchen. Mit Join hatte ich das auch versucht - aber irgendwie ging das total in die Hose - das Ergebniss war nämlich das gleiche - der String nur 2x so lang ;) Joins sind auch nicht so meines - quick&diry-deluxe - meists.

Wie bekomme ich das den sauber hin? Da ich den String auch für die Pagination benötige, sollte die Lösung via mySQL erfolgen - nicht per PHP.


Gruß
Wuppi
Benutzeravatar
oxpus
Ehemaliges Teammitglied
Beiträge: 5389
Registriert: 03.02.2003 12:33
Wohnort: Bad Wildungen
Kontaktdaten:

Re: mySQL: einzigartige Kombi Zählen

Beitrag von oxpus »

Das müsste mit count(distinct name) klappen.
Sollte deine Datenbank auch eigentlich schon unterstützen.
Grüße
OXPUS
Kein Support bei unaufgeforderten PNs, E-Mails oder auf anderem Weg!!
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: mySQL: einzigartige Kombi Zählen

Beitrag von Miriam »

SELECT COUNT(DISTINCT personid) AS personid, filmid FROM rollen GROUP BY filmid;
Ungetestet.
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Re: mySQL: einzigartige Kombi Zählen

Beitrag von gn#36 »

Ich werf' auch mal ne Lösungsmöglichkeit in den Raum (ebenfalls nicht getestet):

Code: Alles auswählen

SELECT personid, COUNT(DISTINCT filmid ) AS anz, name FROM rollen WHERE funktion LIKE 'Darsteller' and filmid=143138 GROUP BY persidofdb ORDER BY anz DESC
Du willst ja schon nach wie vor nach Personen gruppieren, denke ich, aber dich interessieren die unterschiedlichen Filme. Also DISTINCT filmid. DISTINCT name würde dir nur sicherstellen, dass jeder Schauspielername nur einmal auftritt (übrigens ist diese Spalte würde ich sagen redundant - eigentlich brauchst du den Namen nur einmal speichern, ich würde den in eine andere Tabelle auslagern). DISTINCT name würde natürlich genauso funktionieren, sofern der Eindeutig ist, aber wichtig ist dass das innerhalb von COUNT(...) steht.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“