SQL - 从UNION查询中识别源表

时间:2009-09-10 12:06:57

标签: sql union

我正在PHP中构建一个RSS源,它使用来自三个独立表的数据。表格均指网站不同区域内的页面。我遇到的问题是尝试在XML中创建链接字段。在不知道每个记录来自哪个表的情况下,我无法创建指向它的正确链接。

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

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

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

任何帮助都将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:27)

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

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

等等。

这允许您拥有字符串数据类型,这可能会使您更轻松地转换到链接(特别是如果您使用的值只需要复制到您的页面而不是被查找或转换)并使用{{1} }子句将允许您像任何其他列(按名称)一样引用它。

请注意使用as - 如果您确定表中没有重复的行(在这种情况下可能为真,因为您有不同的{{ 1}}每个值,我假设标题是唯一的),union all可以避免浪费的排序和删除重复操作。单独使用table_name可能会导致不必要的工作。

如果您希望完成重复删除,只需恢复使用union all

答案 1 :(得分:13)

应该很容易,只需做这样的事情:

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

答案 2 :(得分:0)

添加具有常数值的虚拟列。例如。 “为每个条款选择'funky_table'作为source_table,来自funky_table的标题”,但引号中的名称不同。

答案 3 :(得分:0)

下面的查询效果更好,并为您提供更好的主意,因为上面的查询不会两次渲染行。

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表中获取公共数据,请向左翻转联接