Abfrage über 3 verknüpfteTabellen

Abfrage über 3 verknüpfteTabellen

am 22.03.2006 11:48:53 von Frank Buss

Ich habe folgende 3 Tabellen:

articleImage: articleId, imageId

article: id, userId

image: id, type

Jetzt möchte ich zu einer gegebenen userId alle image-Einträge erhalten,
für die es article-Einträge mit dieser UserId gibt, also z.B. mit folgendem
Datenbestand:

article: id=1, userId=1
article: id=2, userId=2
article: id=3, userId=1
articleImage: articleId=1, imageId=1
articleImage: articleId=1, imageId=2
articleImage: articleId=2, imageId=3
articleImage: articleId=3, imageId=4
image: id=1, type="jpg"
image: id=2, type="gif"
image: id=3, type="png"
image: id=4, type="png"

Soll eine Abfrage für userId=1 folgendes Ergebnis liefern:

image.id=1, image.type="jpg"
image.id=2, image.type="gif"
image.id=4, image.type="png"

Statt nur einer Lösung bin ich auch daran interessiert, wie man dorthin
kommt, wobei ich allerdings besser an Beispielen lerne, als durch Manuals
lesen :-)

Was ich bis jetzt habe, ist folgendes:

select image.id,image.type from image inner join articleImage on
articleImage.imageId=image.id where articleImage.articleId=?

Zuvor muß ich allerdings noch ein "select id from article where userId=?"
durchführen und für jede ermittelten articleId führe ich dann obige
join-Abfrage durch, was natürlich nicht so schnell ist, je nach Anzahl der
articleIds.

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

Re: Abfrage über 3 verknüpfte Tabellen

am 22.03.2006 20:52:29 von dnoeth

Frank Buss wrote:

> Jetzt möchte ich zu einer gegebenen userId alle image-Einträge erhalten,
> für die es article-Einträge mit dieser UserId gibt
....
> Was ich bis jetzt habe, ist folgendes:
>
> select image.id,image.type from image inner join articleImage on
> articleImage.imageId=image.id where articleImage.articleId=?
>
> Zuvor muß ich allerdings noch ein "select id from article where userId=?"
> durchführen und für jede ermittelten articleId führe ich dann obige
> join-Abfrage durch, was natürlich nicht so schnell ist, je nach Anzahl der
> articleIds.

Dann schreib doch einfach einen 3-Tabellen-Join :-)

select i.id,i.type
from image i inner join articleImage ai on ai.imageId=i.id
inner join article a on ai.articleId = a.id

Dieter

Re: Abfrage über 3 verknüpfte Tabellen

am 22.03.2006 22:06:51 von Frank Buss

Dieter Noeth wrote:

> Dann schreib doch einfach einen 3-Tabellen-Join :-)
>
> select i.id,i.type
> from image i inner join articleImage ai on ai.imageId=i.id
> inner join article a on ai.articleId = a.id

danke, funktioniert, aber ich verstehe nicht warum :-) In der MySQL
Dokumentation habe ich nur die Syntax gefunden, aber keine detailierte
Erklärung der Grammatik und der Bedeutung. Als Kontrast gibt es z.B. die
SQL 92 Spezifikation (
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ), die mir aber
wieder zu formal ist. Kennt einer einen guten Mittelweg, also eine
Dokumentation, die z.B. Joins mit 3 Tabellen beschreibt, ohne allzu sehr
formal zu sein?

--
Frank Buss, fb@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de

Re: Abfrage über 3 verknüpfte Tabellen

am 23.03.2006 11:14:06 von Christian Kirsch

Frank Buss schrieb:
> Dieter Noeth wrote:
>
>> Dann schreib doch einfach einen 3-Tabellen-Join :-)
>>
>> select i.id,i.type
>> from image i inner join articleImage ai on ai.imageId=i.id
>> inner join article a on ai.articleId = a.id
>
> danke, funktioniert, aber ich verstehe nicht warum :-) In der MySQL
> Dokumentation habe ich nur die Syntax gefunden, aber keine detailierte
> Erklärung der Grammatik und der Bedeutung.

Bislang dachte ich immer, die Syntax sei die Grammatik.
Semantik (Bedeutung) findest Du im Tutorial, das ebenfalls in der
Dokumentation steckt (Kapitel 5, IIRC, mag auch 3 sein).

> Als Kontrast gibt es z.B. die
> SQL 92 Spezifikation (
> http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ), die mir aber
> wieder zu formal ist. Kennt einer einen guten Mittelweg, also eine
> Dokumentation, die z.B. Joins mit 3 Tabellen beschreibt, ohne allzu sehr
> formal zu sein?
>

Ich fürchte, ohne Abstraktion ('formal') kommst Du da nicht weiter.
Morgen fragt einer nach Abfragen über 4 Tabellen, übermorgen will es
jemand für 5 wissen. Dafür gibt's ja formale Syntaxdefinitionen, dass
man nicht jeden Fall einzeln hinschreiben muss.

Das Ding zwischen deinen Ohren hilft Dir dabei, die Abstraktion zu
konkretisieren.

Re: Abfrage über3 verknüpfteTabellen

am 23.03.2006 14:57:22 von Markus Mann

Frank Buss wrote:
>
> Kennt einer einen guten Mittelweg, also eine
> Dokumentation, die z.B. Joins mit 3 Tabellen beschreibt, ohne allzu sehr
> formal zu sein?

Für die Grundlagen:


HTH & Ciao.
--
Markus Mann
];-)