从 UNION 查询中识别源表

问题描述 投票:0回答:5

我正在 PHP 中构建一个 RSS 提要,它使用来自三个单独表的数据。这些表格均涉及网站不同区域内的页面。我遇到的问题是尝试在 XML 中创建链接字段。如果不知道每条记录来自哪个表,我无法创建指向它的正确链接。

有办法解决这个问题吗?我尝试使用 mysql_fetch_field,但它返回表的空白值。

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

还涉及其他字段,但这基本上是我正在使用的查询。

sql union
5个回答
34
投票

只需将常量添加到列列表中,如下所示:

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

即可。

    


15
投票

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



1
投票

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

上面的脚本不会给出重复的数据行并确保

t1和t2之间的所有公共数据作为源t1表。
  1. 非 t2 行源作为 t1 表。
  2. 非 t1 行源作为 t2 表。
  3. 如果您想要 t2 表中的通用数据,请翻转左连接


0
投票


0
投票

SELECT Title, MIN(TableName) AS TableName FROM( SELECT 'table1' as TableName, title from table1 UNION ALL SELECT 'table2' as TableName, title from table2 UNION ALL SELECT 'table3' as TableName, title from table3 ) AS t GROUP BY Title ORDER BY TableName

小提琴
这里

© www.soinside.com 2019 - 2024. All rights reserved.