2009-09-10 34 views
12

我使用來自三個獨立表的數據在PHP中構建RSS源。這些表格都是指網站不同區域內的頁面。我遇到的問題是試圖在XML中創建鏈接字段。不知道每個記錄來自哪張表,我無法創建正確的鏈接。SQL - 從UNION查詢中識別源表

有沒有辦法解決這個問題?我嘗試使用mysql_fetch_field,但它返回表的空值。

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

還有其他字段涉及,但這基本上是我正在使用的查詢。

任何幫助,將不勝感激。

謝謝。

回答

10

應該很容易,只是做這樣的事情:

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

既然贏了,那麼當你這樣做的時候就不會有任何重複的東西被刪除,而是使用Union all。 – HLGEM

22

只需添加一個常數的列清單如下:

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 

這將讓你像:

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

等等。

這允許您使用字符串數據類型,這可能會使您的鏈接轉換更容易(特別是如果您使用的值只需要複製到您的頁面而不是查找或轉換)並使用as子句允許您像任何其他列(按名稱)引用它。

注意使用union all - 如果你一定會有從表中沒有重複的行(這是可能在這種情況下,真正的,因爲你必須爲每個不同的table_name值,我假設標題是唯一的),union all可以避免浪費的排序和刪除重複操作。單獨使用union可能會導致不必要的工作。

如果您希望重複刪除,請恢復爲使用union

+0

無論您是否使用union或union all,執行此操作都可能導致重複記錄。 – Zoop

0

添加具有常數值的虛擬列。例如。 「爲每個子句選擇'funky_table'作爲source_table,標題來自funky_table」,但在引號中使用不同的名稱。