2011-01-10 11 views
1

Ich muss aus mehr als einer Tabelle auswählen, die viele Felder hat. Muss ich manuell die Abfrage wie folgt herzustellen:Mehrere Tabellen ohne AS (Alias) auswählen?

table1.field1 AS table1_field1, table1.field2 AS table1_field2, ..., table2.field1 AS table2_field1, ... 

Oder gibt es eine Abhilfe für dieses in MySQL oder PHP, die automatisch kümmert sich um alle diese stattfinden wird, wenn identische Feldnamen in den Tabellen sind?

In PHP, habe ich versucht:

$results = $conn -> query("SELECT table1.*, table2.* FROM table1, table2 WHERE 1"); // $conn is a mysqli object 
$results = $results -> fetch_array(); 

Aber wenn es ein Feld in beiden der zwei Tabellen mit dem Namen ‚title‘, $ results [ ‚title‘] enthalten würde nur den Wert des Datensatzes aus die 2. Tabelle.

Ich weiß, es gibt numerischen Indizes, die Sie den Wert verwenden können, um Zugriff aber:

  1. Es ist nicht lesbar.
  2. Sie müssen den Code jedes Mal aktualisieren, wenn sich die Tabellenstruktur ändert, z. B. die Reihenfolge der Felder.

Irgendeine Idee?

Antwort

0

Ja, es gibt Abhilfen. mysql- und mysqli-Erweiterungen sowie bestimmte PDO-Treiber haben Funktionen, mit denen Sie Spaltenmetadaten abrufen können. Heres ein PDO Beispiel

So können Sie Tabelle1. * Verwenden und in Konflikt stehende Spaltennamen unterscheiden können.

Auch ein anderer Trick, der funktioniert, weil die Reihenfolge der Spalten in der Ergebnismenge deterministisch ist.

select 'table1' table_sep1 
     table1.* 
     'table1' table_sep2 
     table2.* 

Ich werde den Code bis zu Ihnen verlassen, aber Sie können eine Zeile als Array und Schleife durch den Array-Schlüssel holen. Da sie in der richtigen Reihenfolge sind, können Sie davon ausgehen, dass jede Spalte, die einer Tabellentrennzeichenspalte folgt, zu der durch das Trennzeichen angegebenen Tabelle gehört, bis Sie auf das nächste Trennzeichen stoßen.

1

Nein, in SQL gibt es keine Konvention zum dynamischen Generieren von Spaltenaliasnamen. Wenn Sie sie brauchen, müssen Sie sie einzeln definieren.

+0

MySQL funktioniert ordnungsgemäß, indem alle Werte aller Felder zurückgegeben werden, auch wenn identische Feldnamen vorhanden sind. PHP scheint jedoch alles zu überschreiben, das den gleichen Feldnamen (Array-Index) hat, da $ results -> fetch_array() immer ein Array zurückgibt THUS-Werte werden vom selben Index (Feldname) überschrieben. Gibt es eine Möglichkeit, dies in PHP zu umgehen? –

+0

@ kavoir.com: Ja, SQL unterstützt Spalten aus verschiedenen Tabellen mit identischen Namen *, solange ein Tabellenname oder eine Aliasreferenz an sie angehängt ist * - andernfalls erhalten Sie eine Fehlermeldung "mehrdeutige Spaltenreferenz". Ich bin nicht stark in PHP, aber es hängt davon ab, was SQL/MySQL unterstützt. –

2

Beachten Sie, dass Sie die Felder nur mit Aliasnamen versehen müssen, die in beiden Tabellen vorkommen, und selbst dann müssen Sie nur die zweite Spalte aliasieren. Wenn Sie das Feld nur aus einer der Tabellen möchten, können Sie nur dieses Feld in die Liste der abzurufenden Felder aufnehmen. Schließlich können Sie jeden Tabellennamen selbst mit einem kürzeren Namen versehen, der dann in den Spaltenaliasen verwendet werden kann.

Also, alles in allem, man kann so etwas tun:

SELECT t1.id, t1.title, t2.title as second_title, t2.somethingelse 
    FROM table1 t1 INNER JOIN table2 t2. . . 
0

Sie können über numerische Indizes laufen und jeden Index für Namen überprüfen:

$result = mysql_query('select t1.*, t2.* from t1, t2'); 
$num = mysql_num_fields($result); 
for ($i = 0; $i < $num; $i++) { 
    $column_name = mysql_field_name($result, $i); 
} 

Wenn Sie wirklich es brauchen, ist dieses eine schmutzige Abhilfe könnte zu unterscheiden, welche Tabelle Sie sind während über Iterieren: select 1 as _t1_, t1.*, 1 as _t2_, t2.* from t1, t2 . Dummy-Spalten geben an, wo Tabellenspalten beginnen.