2009-09-10 4 views
12

Ich erstelle einen RSS-Feed in PHP, der Daten aus drei separaten Tabellen verwendet. Die Tabellen beziehen sich alle auf Seiten in verschiedenen Bereichen der Site. Das Problem, das ich habe, versucht, die Verbindungsfelder innerhalb des XML zu verursachen. Ohne zu wissen, aus welcher Tabelle die einzelnen Datensätze stammen, kann ich nicht die richtige Verknüpfung erstellen.SQL - Ermitteln der Quellentabelle aus der UNION-Abfrage

Gibt es eine Möglichkeit, dieses Problem zu lösen? Ich habe versucht, mysql_fetch_field, aber es gab leere Werte für die Tabellen.

$sql = " 
SELECT Title FROM table1 
UNION 
SELECT Title FROM table2 
UNION 
SELECT Title FROM table3"; 

Es gibt andere Felder beteiligt, aber das ist im Grunde die Abfrage, die ich verwende.

Jede Hilfe wäre willkommen.

Danke.

Antwort

10

sollte einfach genug sein, nur so etwas tun:

$sql = " 
SELECT Title, 1 FROM table1 
UNION 
SELECT Title, 2 FROM table2 
UNION 
SELECT Title, 3 FROM table3"; 
+1

Da es keine Dubletten zu entfernen gibt, wenn Sie dies tun, verwenden Sie stattdessen Union all. – HLGEM

22

Nur eine Konstante zu Ihrer Spaltenliste hinzufügen wie folgt:

select 'table1' as table_name, title from table1 
union all 
select 'table2' as table_name, title from table2 
union all 
select 'table3' as table_name, title from table3 

, die Sie so etwas wie erhalten wird:

table_name | title 
-----------+----------------------------- 
table1  | war and peace 
table2  | 1984 
table3  | terminator salvation 

und so weiter.

Dies ermöglicht Ihnen Zeichenkettendatentypen, die wahrscheinlich die Konvertierung zu Links einfacher machen (insbesondere wenn Sie Werte verwenden, die nur auf Ihre Seite kopiert anstatt nachgeschlagen oder konvertiert werden müssen) und die Klausel as verwenden erlauben Sie es wie jede andere Spalte (namentlich) zu referenzieren.

Beachten Sie die Verwendung von union all - wenn Sie sicher sind, dass es aus den Tabellen keine doppelten Zeilen (was wahrscheinlich wahr in diesem Fall ist, da Sie einen anderen table_name Wert für jeden haben, und ich gehe davon aus dem Titel sind einzigartig), die union all kann eine vergeudete sort-and-remove-duplicate Operation vermeiden. Die alleinige Verwendung von union kann zu unnötigen Arbeiten führen.

Wenn Sie möchten, dass die Duplizierung entfernt wird, verwenden Sie einfach union.

+0

Dies könnte zu doppelten Datensätzen führen, unabhängig davon, ob Sie union oder union all verwenden. – Zoop

0

Fügen Sie eine Dummy-Spalte mit einem konstanten Wert hinzu. Z.B. "Wählen Sie 'funky_table' als source_table, Titel von funky_table" für jede Klausel, aber mit anderen Namen in den Anführungszeichen.

Verwandte Themen