[MySQL] Verbindungstabelle -> Wert aus Tabelle als Variable speichern

Steusi

Nasenbär
Hallo, ich arbeite gerade an einem Datenbankdesign und stehe vor einem Problem.

Ich möchte folgende Verbindungstabelle kreieren:

patch:
patchid | refid | tabid
1 | 1 | 2
2 | 2 | 2
Alle 3 Spalten zusammen ergeben den Primärschlüssel.

Tabellen:
tabid | name
1 | telefon (ist ein Tabellenname)
2 | pc (ist ein Tabellenname)

pc:
id | name
1 | Hans
2 | Werner

Möchte jetzt aus der ersten Tabelle "patch" die ID auslesen um aus der Tabelle "Tabellen" den Namen der Tabelle zu erhalten. Ist ja kein Problem!
SQL:
SELECT name FROM tabellen WHERE ID =(SELECT tabid FROM patch WHERE pachtid = 1)
Die Tabelle heißt also pc.

Aus Tabelle pc möchte ich nun anhand der refid aus Tabelle "patch" den Namen aus Tab. pc erhalten.

SQL:
SELECT name
FROM 
    (SELECT name FROM tabellen WHERE ID =(SELECT tabid FROM patch WHERE pachtid = 1)) AS tmp
WHERE ID =(SELECT refid FROM pacht WHERE pachtid = 1)

Bekomme nur den Fehler: #1054 - Unknown column 'name' in 'field list'

Ich hoffe jemand versteht meinen Ansatz und kann mir einen Rat geben, wie man dieses Problem lösen kann.
 
Zuletzt bearbeitet von einem Moderator:
Geht mWn nur mit zusammensetzen...
SQL:
--Den Tabellennamen @tab und die ReferenzId @refid setzen
SELECT 
    @tab:=t.name,
    @refid := p.refid 
FROM 
    tabellen AS t
    INNER JOIN patch AS p
        ON t.ID = p.tabid
WHERE
    p.patchid = 1;
--SQL-Statement mit @tab als Tabellennemane zusammensetzen    
SET @sql = CONCAT('SELECT * FROM ', @tab, ' WHERE id = ?');
--SQL-Statement für die Ausführung vorbereiten
PREPARE stmt FROM @sql;
--SQL-Statement mit der @refid ausführen
EXECUTE stmt USING @refid;
 
Zuletzt bearbeitet von einem Moderator:
Danke yaslaw, hast mir wieder mal Methoden gezeigt, wo ich im Handbuch nach schauen musste.

Nachdem ich nun verstehe, was du dort machst entdecke ich keinen Fehler, trotzdem erhalte ich keine gewünschte Ausgabe bei PHPMyAdmin, sondern nur die Anzahl der gefundenen Zeilen.

Einmal auf das wesentliche gekürzt:
SQL:
SET @tab := 'tbl_pc';# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).
SET @refid :=1;# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).
SET @sql = CONCAT( 'SELECT * FROM ', @tab , ' WHERE ID = ', @refid ) ;# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).
PREPARE stmt FROM @sql ;# MySQL lieferte ein leeres Resultat zurück (d.h. null Zeilen).
EXECUTE stmt;# Zeilen: 1

Kannst du mir dies erklären? Also ich denke nicht das es im PHP Script später anders sein wird oder?
Wie gesagt ich bin erst beim Datenbankentwurf, möchte natürlich auch ein Modell entwickeln, welches ich gut abfragen kann.
 
Zuletzt bearbeitet von einem Moderator:
Ich habe mit HeidiSql Portable geübt und da gibts die Zeile aus.

Entweder du packst das alles in eine Stored Procedure oder du baust dein Query in PHP zusammen.

1) Abfrage nach dem Tabellennamen
2) SQL-String zusammensetzen
3) Abfragen der Daten

PHP:
<?php
include('connect.php');

$sql = 
<<<EOT
SELECT 
    t.name,
    p.refid 
FROM 
    tabellen AS t
    INNER JOIN patch AS p
        ON t.ID = p.tabid
WHERE
    p.patchid = 1;
EOT;

$result = mysql_query($sql);
$row = mysql_fetch_array($result);

$sql = "SELECT * FROM {$row['name']} WHERE id = {$row['refid']}";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

var_dump($row);

?>
 
Zuletzt bearbeitet:
Der Weg über PHP ist mir auch bewusst, wollte nur so viel wie Möglich von der DB erledigen lassen. Ich werde es dann noch einmal testen, wenn es so weit ist. Vielen Dank für den Ideenansatz und den fertigen Code!
 

Neue Beiträge

Zurück