2012-10-31 7 views
6

Beispiel table1:Mysql Auto hinzufügen Präfixe Felder

id | field1 | field2 
-------------------- 

table2:

id | id1 | field1 | field2 
-------------------------- 

Ist es möglich, dies zu tun:

select t1.*, t2.* from table1 t1 inner join table2 t2 on t1.id = t2.id1 

und erhalten dieses Ergebnis:

t1_id | t1_fiedl1 | t1_field2 | t2_id | t2_id1 | t2_fiedl1 | t2_field2 
---------------------------------------------------------------------- 

Ziel ist es, mysql Auto hinzufügen Präfixe resultierende Felder zu vermeiden, lange Typisierungen, wie

select t1.id as t1_id, t1.field1 as t1_field1 

und so weiter

+1

Haben Sie es versucht? – hims056

+0

Sie können die Kopfzeile erhalten, ich bin nicht sicher über Daten, bitte probe Beispieldaten und erklären, was Sie erwarten –

+0

Ich Präfix meine Feldnamen mit einer beschreibenden Drei-Buchstaben-Abkürzung des Tabellennamens für alle Tabellen. –

Antwort

4

Die SQL-Engine Ihre Abfrage nicht neu schreiben wird für Sie auf "Auto-alias" Felder - Aliase explizit sein muss.

Sie haben jedoch zwei Optionen im Client-Code.

Erstens könnte man offensichtlich eine Abstraktion schreiben, die die Abfrage zusammenfügt und dabei Aliase bereitstellt.

Zweitens, und einfacher, verwendet die Informationen in den zugrunde liegenden MYSQL_FIELD Strukturen mit jedem Ergebnissatz ausgesetzt. Diese enthalten den Feld- und Tabellennamen (und andere Informationen) über jedes Feld, so dass Sie t1_field1 programmgesteuert zusammenfügen können, ohne vorher die Feldnamen zu kennen. Wie diese Informationen verfügbar gemacht werden, hängt von Ihrer speziellen Client-API ab.

+1

einige Beispielcode wäre großartig. – petermeissner

-1
select t1.id as t1_id, t1.fiedl1 as t1_fiedl1 , 
    t1.field2 as t1_field2 ,t2.id as t2_id , 
    ,t2.fiedl1 as t2_fiedl1 ,t2.field2 as t2_field2 
    from table1 t1 left outer join table2 t2 on t1.id = t2.id1 
+0

Der Punkt der Frage ist, alle Felder anonym auswählen zu können und immer noch das Präfix zu haben. –

+0

versuchen Sie diese aktualisierte Lösung – jainvikram444

2

Das Ziel ist es, mysql Auto hinzufügen Präfixe zu machen In den Feldern führt, lange Typisierungen, wie

select t1.id as t1_id, t1.field1 as t1_field1 and so on

zu vermeiden

Wenn die Feldnamen in beiden Tabellen identisch sind, erhalten Sie keine Spalten aus beiden Tabellen.
Sie müssen Spaltennamen mit einem bestimmten Aliasnamen schreiben, um dies zu erreichen.

Für z.B.

SELECT t1.id t1_id, t1.field1 t1_fiedl1, t1.field2 t1_field2 
     ,t2.id t2_id, t2.id1 t2_id1 ,t2.field1 t2_fiedl1, t2.field2 t2_field2 
FROM table1 t1 
INNER JOIN table2 t2 
     ON t1.id = t2.id1 

See this SQLFiddle Demo

Wenn Felder Name auf beiden Tabellen unterschiedlich sind, dann können Sie das tun, das gewünschte Ergebnis zu erzielen.

Für z.B.

SELECT  t1.*, t2.* 
FROM  table1 t1 
INNER JOIN table2 t2 
     ON t1.id = t2.id1; 

See this SQLFiddle

+1

Ich weiß das. Aber es ist wirklich nervig, besonders wenn ich 3 und mehr Joins auf Tabellen mit 20+ Feldern betreibe. Und was, sollte ich an Synonyme denken, sagen wir, Feld 'name', das in jeder Tabelle verwendet wird? Deshalb frage ich. Vielleicht gibt es eine flexiblere Lösung. – abr

+0

Die Engine gibt immer * alle * Felder in der Projektion zurück. Client-APIs, die Zeilen basierend auf dem standardmäßigen, nicht qualifizierten Spaltennamen abrufen, sehen jedoch nicht mehrere Felder mit demselben "Namen". SQLFiddle scheint eine solche API zu benutzen, weshalb es in Ihrer Anfrage nicht 'id' von 'id' unterscheiden kann, sondern die Kommandozeile 'mysql (1) 'client kann. – pilcrow

0

Nein, mysql stellt die Spalten nicht automatisch voran. Das einzige, was Sie tun werden, ist manuell ein alias um die Spalten hinzuzufügen. Wenn Sie das nicht tun möchten, sollten Sie Ihre Spalten so umbenennen, dass aus jeder Tabelle ein eindeutiger Name entsteht.Wenn Sie keine alias hinzufügen und es Spalten mit demselben Namen gibt, ist die Tendenz, dass die Spalte aus der ersten Tabelle angezeigt wird. Dies ist normal aufgrund von Namenskonflikten zwischen Tabellen.