2009-09-10 13 views
12

Buduję kanał RSS w PHP, który wykorzystuje dane z trzech oddzielnych tabel. Wszystkie tabele odnoszą się do stron w różnych obszarach witryny. Problem, który mam, próbuje utworzyć pola połączenia w XML. Nie wiedząc, z której tabeli pochodzi każdy rekord, nie mogę utworzyć poprawnego linku do niego.SQL - Identyfikacja tabeli źródłowej z zapytania UNION

Czy istnieje sposób rozwiązania tego problemu? Próbowałem użyć mysql_fetch_field, ale zwróciło puste wartości dla tabel.

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

W grę wchodzą inne dziedziny, ale jest to w zasadzie kwerenda, której używam.

Każda pomoc zostanie doceniona.

Dzięki.

Odpowiedz

10

Powinno być dość łatwe, po prostu zrobić coś takiego:

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

Ponieważ nie ma żadnych duplikatów do usunięcia, gdy to zrobisz, użyj zamiast tego Unii. – HLGEM

22

Wystarczy dodać stałe do swojej listy kolumnowej następująco:

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 

który będzie Ci coś takiego:

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

i tak dalej.

Pozwala to na posiadanie typów danych ciągów, które prawdopodobnie ułatwią konwersję na linki (szczególnie jeśli używasz wartości, które po prostu trzeba skopiować na stronę zamiast ich wyszukiwać lub konwertować), a użycie klauzuli as spowoduje pozwala na odwołanie się do niego jak do każdej innej kolumny (według nazwy).

Uwaga wykorzystanie union all - jeśli jesteś pewien, że nie będzie żadnych zduplikowanych wierszy z tabel (co jest prawdopodobnie prawda w tym przypadku, ponieważ masz inny table_name wartość dla każdego i jestem przy założeniu, że tytuły są unikatowe), union all może uniknąć zmarnowanej operacji sortowania i usuwania duplikatów. Samodzielne korzystanie z union może spowodować niepotrzebną pracę.

Jeśli chcesz wykonać zduplikowane usunięcie, po prostu powróć do korzystania z union.

+0

Może to spowodować duplikowanie rekordów, niezależnie od tego, czy używasz związków, czy związków. – Zoop

0

Dodaj pustą kolumnę o stałej wartości. Na przykład. "Wybierz" funky_table "jako source_table, title z funky_table" dla każdej klauzuli, ale z różnymi nazwami w cudzysłowach.

Powiązane problemy