MySQL select über mehrere Tabellen

Nalia

Benutzer
Beiträge
12
Hallo,
ich bin neu hier im Forum und hoffe, dass ich hier richtig bin und mir irgendwer helfen kann.
Folgende Situation:
Ich habe drei Tabellen mit folgender (hier benötigter) Struktur:
pferde [rid,cid]
rassenfelle[rid,cid]
colors[id,farbe]

Ich möchte folgende Abfrage ausführen: Anzahl der Pferde mit den jeweiligen Fellen einer bestimmten Rasse, also beispielsweise: Fuchs = 3, Rappe = 10, Brauner = 12 der Rasse Hannoveraner.
Nach endloser Bastelei habe ich nun folgende Abfrage, aber die funktioniert auch nicht...

select colors.farbe from colors, count(*) from pferde as total
left join rassenfelle on rassenfelle.cid = colors.id
left join colors on pferde.cid = colors.id
where rassenfelle.rid = 20

Kann mir jemand auf die Sprünge helfen?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.532
mal angebommen, die Tabellen sind so verbunden (wir können ohne Definition PK/FK nur raten):

Code:
edb=*# create table farbe(id int primary key, farbe text);
CREATE TABLE
edb=*# create table pferde(rid int primary key, cid int references farbe);
CREATE TABLE
edb=*# create table rassenfelle(rid int references pferde, cid int references farbe);
CREATE TABLE
edb=*# select farbe.farbe, count(*) from rassenfelle left join pferde on rassenfelle.rid = pferde.rid left join farbe on rassenfelle.cid=farbe.id group by farbe;
 farbe | count 
-------+-------
(0 rows)

Einbau einer WHERE-Condition überlasse ich Dir zur Übung.
 

Nalia

Benutzer
Beiträge
12
Danke für die schnelle Antwort. Um sie verstehen zu können, verrate mir, was die Abkürzungen PK/FK bedeuten, und warum muss ich dafür drei weitere Tabellen erstellen?
edb=*# hab ich überhaupt noch nie bei meinen Abfragen benutzt. Bin ich hier überhaupt im richtigen Forum?? ^^
 

akretschmer

Datenbank-Guru
Beiträge
9.532
ach so, das edb=*# ist der Prompt meiner Datenbank, diese hat den Namen 'edb' und ich arbeite mit psql, und bin innerhalb einer Transaction.
 

Nalia

Benutzer
Beiträge
12
ok,
habe nun die Abfrage wie folgt:
select farbe.farbe, count(*) from rassenfelle left join pferde on rassenfelle.rid = pferde.rid left join farbe on rassenfelle.cid=farbe.id where rassenfelle.rid=20 group by farbe;
jetzt erscheint die fehlermeldung: Unknown column 'rassenfelle.rid' in 'where clause'.
Das verstehe ich nicht, weil rassenfelle.rid gibt es doch.
 

Nalia

Benutzer
Beiträge
12
ja, war einer drin, sorry, aber das ergebnis lautet nun:
farbe: Fuchs, total: 60
farbe: Rappe, total: 60 usw.
60 ist die Gesamtzahl aller Pferde dieser Rasse
ich wollte aber eigentlich die Gesamtanzahl der einzelnen Felle der Pferde dieser Rasse wissen,
also Rasse = 20 (Hannoveraner)
farbe Rappe = 12,
farbe Fuchs = 8 usw.
 

akretschmer

Datenbank-Guru
Beiträge
9.532
Da wir Deine Daten nicht kennen ist das schwer nachzuvollziehen alles ...

Code:
edb=*# insert into farbe values (1, 'rot');
INSERT 0 1
edb=*# insert into farbe values (2, 'blau');
INSERT 0 1
edb=*# insert into pferde values (1,1);
INSERT 0 1
edb=*# insert into pferde values (2,1);
INSERT 0 1
edb=*# insert into pferde values (3,2);
INSERT 0 1
edb=*# insert into rassenfelle values (1,1);
INSERT 0 1
edb=*# insert into rassenfelle values (2,1);
INSERT 0 1
edb=*# insert into rassenfelle values (3,2);
INSERT 0 1
edb=*# select farbe.farbe, count(*) from rassenfelle left join pferde on rassenfelle.rid = pferde.rid left join farbe on rassenfelle.cid=farbe.id group by farbe;
 farbe | count 
-------+-------
 blau  |     1
 rot   |     2
(2 rows)
 

Nalia

Benutzer
Beiträge
12
in der Tabelle pferde stehen die Pferde mit rid (Rassen-id) und cid (farb-id),
in der Tabelle farbe stehen die id(primaryKey) sowie sämtliche möglichen Farbschläge aller Rassen drin (Apfelschimmel, Palomino, Rappe usw.)
da aber jede Rasse noch unterschiedliche Farben hat, gibt es die Tabelle rassenfelle, in der ich aufgelistet habe, welche Farbschläge in welcher Rasse vorkommen, also dort stehen:
cid und rid drin
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.532
also können in pferde auch mehrere Einträge mit derselben rid stehen? Dann wäre die rid aber kein PK mehr.

Wie gesagt, ohne wirklich zu verstehen, was Du da als Datenmodell hast, wird es schwer, das alles zu erraten.

Vielleicht zeigst Du einfach mal die 3 Tabellen mit je 3-4 Datensätzen und dem, was rausskommen soll, mit diesen Datensätzen?
 
Oben