簡體   English   中英

從 UNION 查詢中識別源表

[英]Identifying source table from UNION query

我正在用 PHP 構建一個 RSS 提要,它使用來自三個單獨表的數據。 這些表格都引用了站點不同區域內的頁面。 我遇到的問題是嘗試在 XML 中創建鏈接字段。 在不知道每條記錄來自哪個表的情況下,我無法創建正確的鏈接。

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

SELECT Title FROM table1
UNION 
SELECT Title FROM table2
UNION 
SELECT Title FROM table3

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

只需在您的列列表中添加一個常量,如下所示:

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

應該很容易,只需執行以下操作:

SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3

添加具有常量值的虛擬列。 例如。 對於每個子句,“選擇 'funky_table' 作為 source_table,標題來自 funky_table”,但引號中的名稱不同。

下面的查詢效果更好,並為您提供更好的想法,因為上面的查詢不會兩次呈現行。

SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN 
t1
ON t1.id=t2.id
WHERE t1.id=null

上面的腳本不提供重復的數據行並確保

  1. t1 和 t2 之間的所有常見數據作為源 t1 表。
  2. 非 t2 行源為 t1 表。
  3. 非 t1 行源作為 t2 表。

如果您想要 t2 表中的公共數據,請翻轉左連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM