MySQL Select als Variablen innerhalb der Abfrage nutzen möglich?

ZENeca

Grünschnabel
Hallo allerseits,

bin mir nicht sicher, ob meine Anliegen überhaupt möglich ist oder letztlich der Versuch ist sich am eigenen Schopf aus dem Sumpf zu ziehen.
Ich möchte innerhalb einer Abfrage Ergebnisse des SELECT nutzen.
Habe viel gesucht, gelesen und herumprobiert und komme auf keinen grünen Zweig
also wenn ich es richtig Verstanden habe kann man sich mit INTO wohl SELECT werte in Variablen eintragen,
aber wie kann ich die dann weiter nutzen?

Eigentlich will ich einen Variablen JOIN bei denen sich erst während der Abfrage die zugehörige Tabelle ergibt.
Alles schwer zu erklären, hier mal mein (vereinfachter) Lösungsansatz, vielleicht wird es dann eher klar.

Code:
SELECT cart.id, cart.tabname pic.path INTO @id, @tab, @path
FROM korb AS cart 
LEFT JOIN @tab AS pic ON pic.id = cart.id;

die Fehlermeldung: ...near '@tab AS pic

also irgendwie sieht das schon komisch aus und es scheint sich da die Katze in den Schwanz zu beißen
wenn es so nicht zu lösen ist, gäbe es da noch eine andere elegante Möglichkeit?
oder wäre so etwas nur über mehrere Abfragen machbar?
das würde ich natürlich hinbekommen, wäre aber wohl nicht besonders performant

vielen Dank im Voraus

Zen
 
Mir scheint, Du hast für jedes Tab eine eigene Tabelle eingerichtet wobei der Name der Tabelle gleich dem des Tabs ist. Wenn das zutrifft, erwarte ich, dass sich alle Fragen auflösen wenn Du nur eine Tabelle für die Tabs einrichtest mit dem Tabnamen in einer Spalte.
Wenn das nicht zutrifft, dann erkläre doch Mal was sich dahinter verbirgt, es gibt ja anscheinen Karten und Bilder und einen (Waren?-)Korb.
 
Hallo Sempervivum,

vielen Dank für deine Antwort.

Also: @tab steht nur abgekürzt für Tabelle und enthält den Namen einer Tabelle.
Die Tabellen haben verschieden Strukturen, lassen sich also nicht einfach zusammenführen
haben aber auch gleiche Feldnamen mit gleicher Funktion (z.B. Bilder)
und Ja, der Korb ist ein Warenkorb und soll natürlich in seiner Zusammenfassung
auch die Bilder der verschiedenen Artikel anzeigen

Praktisch gibt es einen allgemeinen Katalog mit verschieden Tabellen
jede Tabelle enthält wiederum eine bestimmte Objektkategorie
in der alle erdenklichen Objekte zu dieser Kategorie standardisiert erfasst werden können.
Dann gibt es zu den meisten Tabellen auch einen Marktplatz auf dem die standardisierten Objekte gehandelt werden können indem sie aus dem Standardkatalog hinzugefügt werden.
Mit seinem Warenkorb soll man natürlich nicht an nur eine Kategorie gebunden sein

hab schon mal eine Kleinigkeit vorbereitet um sich eine konkrete Vorstellung machen zu können

Catal0g - sammeln - kfz-Kennzeichen
Marktplatz - kfz-Kennzeichen

Catal0g - Speichermodule
Marktplatz - Speichermodule

...und jetzt darf man natürlich Speicher wie auch Kennzeichen seinem Warenkorb hinzufügen
das ist alles ;-)
 
"das ist alles" - OK, schon ein wenig komplizierter als ich es mir vorgestellt hatte :). Dann sind die Datenbankspezialisten gefragt, um eine Lösung nur in SQL anzugeben.
 
mWn kannst du nur Werte, nicht aber Naemn als Variablen führen. Also Tabellennaemn, Spaltennamen etc gehen nicht. Also in dem SQL genau gar nichts.
Das setzt man nomalerweise in einer anderen Sprache zusammen.
 
hm, das wollte ich aber jetzt nicht hören :o((
das hieße ja nur Mehrfachabfragen mit z.B. php?

ich habe aber auch mein obiges Beispiel mit Werten (=Zahl?) versucht...

Code:
SELECT cart.id, cart.tabname pic.path INTO @id, @tab, @path
FROM korb AS cart 
LEFT JOIN tabelle AS pic ON pic.id = cart.@id;

mit gleichem Ergebnis, also ...near '@tiid' at line...
 
Ich bin in der Zwischenzeit der Frage noch ein wenig weiter nachgegangen und habe dies gefunden wo jemand ein ähnliches Problem hatte, dynamischer Tabellenname:
Dynamic table name at sql statement
Darauf hin habe ich versucht, eine stored function zu schreiben mit dem Ziel, sie in der endgültigen Abfrage verwenden zu können:
Code:
DROP FUNCTION IF EXISTS getpicpath;
delimiter //
CREATE FUNCTION getpicpath(name VARCHAR(255), id INT)
    RETURNS VARCHAR(255)
    BEGIN
        SET @s = CONCAT('select actor from ', name, ' where ID = ', id, ' into @result');
        PREPARE stmt1 FROM @s;
        EXECUTE stmt1;
        RETURN 'xxx'; -- Dies müsste noch genauer aufbereitet werden
    END//
delimiter ;
SELECT getpicpath('actor', 1);
(Zum Testen mit einer vorhandenen Tabelle)
Gescheitert ist dieser Ansatz leider daran, dass in einer FUNCTION keine prepared statements zulässig sind.

Man könnte noch an die Alternative denken, die Parameter, die in den Tabellen der verschiedenen Kategorien einheitlich sind, in einer Tabelle zusammen zu fassen. Aber es ist fraglich, ob Du die Struktur so stark ändern kannst.
 
hihihi.....:)
[SQLite-Tutorial] Wie benutze Ich Parameter für Tabellen- und Spaltennamen

Nachtrag:
Das hier enthält Fehler.
1) Da fehlt ein Komma zwischen cart.tabname und pic.path
2) mWn muss man jede Variable explizit separat zuweisen (kann mich aber auch irren)
3) Allein "cart.tabname" ist für mich ne rote Flagge, dass es sich hier um ein EAV-Antipattern handelt, was pfui bäähh ist
SQL:
SELECT cart.id, cart.tabname pic.path INTO @id, @tab, @path
FROM korb AS cart
LEFT JOIN @tab AS pic ON pic.id = cart.id;

Fazit: Allein die Aussage, dass für unterschiedliche Objekte eigene Tabellen existieren müssen ist Unfug, da wie schon erwähnt es "gleiche "Spalten" gibt.

Mein Ansatz wäre: Alle Objekt-Tabellen "zusammenführen" in eine Tabelle. Eine Zusätzliche Spalte "Objekttyp" (was zur Zeit dein Qualifikator ist, auf eine "andere" Tabelle zu gehen).
Alle Spalten, die in allen Tabellen gleich sind, werden auch wieder aufgeführt.
Alle Spalten die ungleich sind (und andere "Funktionen" haben), in einer Spalte zusammenfassen, und dann als JSON reinballern.

btw: Welche MySQL-version?

Nachtrag2: Wieso hast du die Variablen @id und @Path, wenn du im JOIN "hart" cart mit pic (was eigentlich @tab sein soll) verknüpfst?

Nachtrag3: Au weia.
Du hast nen Warenkorb "cart", welcher eine ID hat.
Diese ID setzt du gleich mit der ID von welcher auch immer Objekt-Tabelle du in deinem "dynamischen" JOIN verknüpfen willst.
Jetzt hast du in Tabelle "KFZ-Zeichen" einen Eintrag mit ID 27, welcher dann auch in "cart" mit der ID existieren muss.
und dann hast du in Tabelle "Speichermodule" einen Eintrag mit ID 27, welcher dann in "cart" auch die ID 27 haben muss.....

An deiner Stelle würde ich das DB-Design nochmal gründlich überdenken...

Nachtrag4 (zu meinem "Ansatz" oben): Eine weitere Variante wäre "generische" Spalten zu verwenden (Anstatt alles Objekt-spezifische in eine JSON-Spalte zu knallen), da prinzipell ein Spaltenname komplett uninteressant ist, und eigentlich nur der "Lesbarkeit" dient.
Was man dann machen kann ist eine (ich nenne es zumindest so) "Mapping"-Tabelle zu führen, in welcher für jeden Objekttyp aufgeführt ist, welche Spalten bei einem Query zu ziehen sind.
Im Prinzip sowas wie ein "reverse engineered" INFORMATIONS_SCHEMA
 
Zuletzt bearbeitet:
Zurück