• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Einzelabfragen oder Join möglich?

blabla333

Mitglied
Ich habe eine Tabelle, die Bilder beinhaltet.
Auf der entsprechenden Seite wird aus dieser Tabelle ein Bild abgerufen (Url und Bildbeschreibung).

Zu einem Bild gehören Koordinaten zu bestimmten Bildbereichen. Diese sind in einer zweiten Tabelle gespeichert.
Es können zu einem Bild mehrere Koordinaten gespeichert sein.

Bislang löse ich die Darstellung so:

1) select url, beschreibung, name from bilder where id = x
2) Ausgabe
3) select top, left from bildbereiche where name = name
4) foreach Schleife um alle koordinaten auszugeben

Kann man dieses Konstrukt auch mit einer Abfrage umsetzen? Stichwort Join...
Ich bin noch nicht so wirklich erfahren mit Datenbanken und möchte meine bisherigen Umsetzungen optimieren.
Mein Verständnisproblem ist, dass die Anzahl der Ergebnisse beider Tabellen ja unterschiedlich ist, d.h. Erste Abfrage gibt einen Wert aus, die zweite Abfrage eben mehrere...
 
Werbung:
Du kannst die Statement natürlich in einem Statement zusammen führen. Je nachdem was top und left für Werte enthält könnte man diese mit GROUP_CONCAT auch verbinden. Beispiel:

Code:
select b.url, b.beschreibung, b.name, group_concat( bb.top ) top, group_concat( bb.left ) left
from bilder b
left join bildbereiche bb on b.name = bb.name
where b.id = x
group by b.id

Siehe: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Das Ergebnis in top und left müsstest Du dann mit der von dir verwendeten Programmiersprache auseinander nehmen.

Nachteil dieser Variante ist, dass MySQL eine Grenze für die Anzahl Zeichen hierbei setzt. Wenn diese Zeichenanzahl (ich glaube es sind immernoch 1024) erreicht ist, bricht der String einfach ab und du hast nicht alle Daten in deiner Gruppierung. Bei anderen Datenbanksystemen wie z.B. Oracle gibt es so eine Begrenzung nicht bzw. dort wird so eine Gruppierung anders angewendet.
 
Erst einmal vielen Dank. Leider verstehe ich es noch nicht ganz, weshalb ich mir erst einmal ein leichteres Beispiel (zwei Abfragen in einer Tabelle) erarbeiten muss:

Ich habe eine Tabelle mit den Spalten id, name und elternID
Nun kenne ich die ID, möchte aber den Namen von dem Eltern-Element ausgeben.

Bislang würde ich es so machen:
1. Abfrage: select elternID from tabelle where id=x
2. Abfrage: select name from tabelle where id=elternID

Diese beiden Abfragen muss ich doch auch auf eine einzige reduzieren können - auch wenn es in diesem Fall nur eine Tabelle ist, oder?
 
Werbung:
[erst falschen Text reingeschrieben]

Das was ich dir oben geschrieben hatte ist schon genau die Antwort auf das was Du suchst. Was genau daran verstehst Du nicht und wiederholst die Frage nochmal?
 
Soweit komme ich jetzt damit klar. Allerdings würde ich gerne eine dritte Verknüpfung einbinden und das will nicht recht gelingen:

Code:
select b.url, b.beschreibung, b.name, group_concat( bb.top SEPARATOR "|" ) top, group_concat( bb.left SEPARATOR "|" ) left, group_concat( bp.name SEPARATOR "|" ) parent_image
from bilder b
left join bildbereiche bb on b.name = bb.name
left join bilder bp on b.parent = bp.id
where b.id = x
group by b.id

Edit:
Es gibt insgesamt zwei Tabellen; es sollen aber drei Verknüpfungen entstehen:
1) bilder (Hier sind die Daten (id, url, name, beschreibung, parent_id) zu Bildern hinterlegt)
2) bildbereiche (top, left, beschreibung)

Der erste Teil ist ja gelöst, nämlich die bildbereiche zu dem ausgewählten Datensatz von bilder zu verknüpfen

Die dritte Verknüpfung macht mir aber Probleme:
In "bilder" gibt es auch das Feld "parent_id", welches eine id einer anderen Zeile der gleichen Tabelle "bilder" beinhaltet (oder auch leer sein kann).

Nun möchte ich eben auch diesen verknüpften Datensatz haben.

D.h. ein Ergebnis könnte so aussehen:
http://www.website.de/url; Eine Beschreibung; Bildname; 100|120; 50|70; Bild2name| Bild3name

Das letze Feld ergibt sich wie gesagt aus dem Feld parent_id von "bilder" -> Diese ID verweist auf die HauptID der gleichen Tabelle -> Hier wird der Name ausgewählt, d.h. es wird in der gleichen Tabelle auf eine andere Zeile verwiesen.

Ich hoffe, es ist verständlich...
 
Zuletzt bearbeitet:
Zurück
Oben