• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Tabellendatensätze verknüpfen

Steffanus

New member
Hi,
also mein problem ist das ich 3 tabellen miteinander verknüpfen will, und zwar haben eigentlich alle tabellen das gleiche schema:

Tabelle autos
id name

Tabelle fahrräder
id name

Tabelle boote
id name

so, wenn man sich jetzt ein auto ansieht so kann es sein das dieses auch noch mit einem anderen auto, fahrrad und/oder einem boot verknüpft ist. Sobald das Auto "Jaguar" mit dem Fahrrad "Shimano" verknüpft ist so soll jeweils auf beiden seiten ein link zu dem jeweilign partner zu finden sein (verstanden :)).

dazu hab ich noch eine 4. tabelle:

Tabelle links
id link1_id link1_type link2_id link2_type

ich hatte das nun für die ersten beiden tabellen so gelöst, das funktioniert auch, aber wenn ich nun auch noch die tabelle da mit eingliedere habe ich 6 UNIONS und eine meiner meinung nach viel zu aufgeblasene abfrage, geht das nicht auch viel geschickter?

PHP:
  SELECT autos.id AS id, autos.name AS name, 'auto' AS type
  FROM autos
  LEFT JOIN links
  ON (autos.id = links.link2_id AND links.link2_type='auto')
  WHERE link1_id = '$AUFGERUFENE_ID' AND link1_type = 'auto'
 UNION
  SELECT autos.id AS id, autos.name AS name, 'auto' AS type
  FROM autos
  LEFT JOIN links
  ON (autos.id = links.link1_id AND links.link1_type='auto')
  WHERE link2_id = '$AUFGERUFENE_ID' AND link2_type = 'auto'
 UNION
  SELECT fahrraeder.id AS id, fahrraeder.name AS word, 'fahrrad' AS type
  FROM fahrraeder
  LEFT JOIN links
  ON (fahrraeder.id = links.link2_id AND links.link2_type='fahrrad')
  WHERE link1_id = '$AUFGERUFENE_ID' AND link1_type = 'auto'
 UNION
  SELECT fahrraeder.id AS id, fahrraeder.name AS word, 'fahrrad' AS type
  FROM fahrraeder
  LEFT JOIN links
  ON (fahrraeder.id = links.link1_id AND links.link1_type='fahrrad')
  WHERE link2_id = '$AUFGERUFENE_ID' AND link2_type = 'auto'
 
also mein problem ist das ich 3 tabellen miteinander verknüpfen will, und zwar haben eigentlich alle tabellen das gleiche schema:
Was unterscheidet Autos, Boote und Fahrräder voneinander - und zwar nicht physikalisch, sondern datentechnisch?
Mit anderen Worten: Warum gibt es überhaupt drei Tabellen statt nur einer?
 
hätte wohl mal wieder schreiben sollen das es sich nur um ein beispiel handelt da ich nicht meine tabellen mit 20 spalten hierein schreiben wollte, die struktur der tabellen hat schon ihren mehrfach bewehrten Sinn den ich auch für diese vernüpfung nicht ändern werde.
Aber ich denke einfach nur das es über joins noch eine andere möglichkeit der abfrage geben müsste die ich nicht herausbekomme?!

abgesehen davon, das beispiel habe ich gewählt eben gerade weil es datentechnisch natürlich unterschiede gibt.

fahrrad: rahmenhöhe, kurbelsatz, felge, nabe, schaltungsart
auto: hubraum, airbag, türenzahl
boot: gewicht, antriebsstärke, tiefgang, segel

ist für mich ziemlich unterschiedlich?! na und nu stelle sich mal jemand vor, diese hätten alle untereinander eine autonome verknüpfung die NICHT unter einem master steht wie z.B. Besitzer, oder herstellerfirma sondern nur miteinander
(oder vielleicht vorstellbar als terroristische Zellen die nur kontakt untereinander haben und keinen darüber stehenden chef, dadurch können sie ohne probleme weiter autonom agieren auch wenn andere teile zerschlagen sind :))
 
Zuletzt bearbeitet:
ist für mich ziemlich unterschiedlich?! na und nu stelle sich mal jemand vor, diese hätten alle untereinander eine autonome verknüpfung die NICHT unter einem master steht wie z.B. Besitzer, oder herstellerfirma sondern nur miteinander
Autos haben eine ID und einen Namen.
Fahrräder haben eine ID und einen Namen.
Boote haben eine ID und einen Namen.
Sieht für mich erstmal ziemlich gleich aus. Was die Dingers sonst noch zusätzlich haben, ist ja für Deinen JOIN auch erstmal völlig unwichtig, das kann ja durchaus in (untergeordneten) Zusatztabellen stehen.
Und nur weil Du in Deiner Datenbank Terrorzellen abbilden willst, heißt das nicht, dass diese nicht Gemeinsamkeiten haben und man diese nicht nutzen darf (oder sogar sollte). Denn Deine Dingers sind alles Fortbewegungsmittel.
Wenn Du also zukünftig eine Tabelle mit ID, Name und Typ hast, dann ist Deine Zuordnungstabelle und Dein JOIN wieder sehr einfach, weil Du einfach nur zweimal Deine Fortbewegungstabelle mit der Kreuztabelle in einem simplen, überschaubaren SELECT verbinden musst.

Aber Du kannst gerne alle Fälle in Deinen UNIONS durch-X-en, pass nur auf, dass nicht nachher noch Flugzeuge, Motorräder und U-Boote dazukommen.
 
is ja wunderbar wie einem hier geholfen wird, anstatt sich darüber abzulästern das ja die union abfrage so scheisse ist (was ich ja selbst auch gesagt habe) könnte man ja erklären wo die probleme liegen und wie man das am besten anpacken kann. zwar hab ich aus der ekelhaften ironie nun rausgelesen das es besser wäre noch eine abgespeckte tabelle mit id name anzulegen um die daten zu vereinen, aber das kann man sicher auch produktiver kommunizieren, immer dieses nerd-verhalten....
 
is ja wunderbar wie einem hier geholfen wird, anstatt sich darüber abzulästern das ja die union abfrage so scheisse ist (was ich ja selbst auch gesagt habe) könnte man ja erklären wo die probleme liegen und wie man das am besten anpacken kann. zwar hab ich aus der ekelhaften ironie nun rausgelesen das es besser wäre noch eine abgespeckte tabelle mit id name anzulegen um die daten zu vereinen, aber das kann man sicher auch produktiver kommunizieren, immer dieses nerd-verhalten....
Deine Lösung passt nicht zu Deinem Problem. Denn Dein Problem ist nicht die SQL-Abfrage, sondern die Datenstruktur. Die Vorschläge zur eigentlichen Lösung des Problems hast Du bislang nicht wirklich ernstgenommen, da Du dieses Problem offensichtlich noch nicht begriffen hast.

Und was sollen wir Dir das Problem mit den Unions erklären, wenn Du es a) schon selbst gemerkt hast, dass Du für jede Kombination eine zusätzliche SELECT Anweisung anlegen musst (was die Ausführungszeit weiter nach oben treibt) und b) mit EXPLAIN sehen kannst, was diese Abfrage auf der Datenbank anrichtet.

Normalerweise gehe ich davon aus, dass der Threadersteller eine gewisse Grundintelligenz mitbringt und er/sie/es in der Lage ist sein Problem nach meinen Hinweisen aus der Entfernung zu betrachten und dabei den möglicherweise vorhandenen, anderen Blickwinkel oder eben meine Sichtweise nachzuvollziehen. Hier hast Du aber Deine Scheuklappen aufgehabt und bist weiter stur Deine Linie gefahren, weil es für Dich außer Frage steht, die irgendwann einmal abgesegnete, mittelerweile betagte und wohl leidlich laufende Datenstruktur überhaupt anzufassen. In Indien fasst man eine heilige Kuh ja auch nicht an, an Rindersteak ist gar nicht zu denken.

Da Du die zuletzt vorgetragene Idee der Umstrukturierung nicht komplett und von vorneherein abgelehnt hast, besteht zumindest die Hoffnung, dass aus Deiner Datenbank doch noch was wird, zumindest in diesem Bereich. Ansonsten ist der Ratschlag von Zeitgeist sicherlich nicht verkehrt, auch wenn das Thema Dir offensichtlich artfremd ist.
 
Zurück
Oben