向UNION ALL查询添加额外字段

时间:2014-01-24 00:01:37

标签: php mysql sql

我有一系列与各种网站和部分相对应的数据库表 - 例如MySite / World,MySite2 / World,MySite3 / People等

我正在将所有这些项目合并到一个新网站中。但是为了使项目工作,我需要在我的查询中保留每个数据库表的标识 - 每个数据库表的原始网站和部分的名称。在另一个线程中,stackoverflow上的某个人向我展示了如何从数据库表中派生静态值(例如,选择'GZ'AS GSiteID)。所以我结束了以下查询(虽然它实际上查询的表格多于我在下面列出的表格):

 $stm = $pdo->prepare("SELECT 'GZ' AS GSiteID, 'Life' AS GSection, GZL.Taxon AS URL
  FROM gz_life GZL WHERE GZL.Taxon = :MyURL
  UNION ALL
  SELECT 'All' AS GSiteID, 'World' AS GSection, GG.Name FROM gw_geog GG WHERE GG.Name = :MyURL
  UNION ALL
  SELECT 'GS' AS GSiteID, 'World' AS GSection, GS.URL FROM gs GS WHERE GS.URL = :MyURL
  UNION ALL
  SELECT 'PX' AS GSiteID, 'People' AS GSection, Ppl.URL FROM people Ppl WHERE Ppl.URL = :MyURL
  UNION ALL
  SELECT 'PX' AS GSiteID, 'Orgs' AS GSection, PXO.URL FROM orgs PXO WHERE PXO.URL = :MyURL");
 $stm->execute(array(
 'MyURL'=>$MyURL
 ));

while ($row = $stm->fetch())
{

它工作正常,但有一个问题。表 orgs 实际上与多个网站相关联。例如,在一个政治网站上可能会有一篇关于亚伯拉罕林肯(URL = Abraham_Lincoln)的文章和一篇关于地理网站上一些着名探险家的文章。或者可能有两篇关于政治活跃科学家的文章,一篇在政治网站上,另一篇在科学网站上。

因此,表人和组织有一个名为站点的额外字段。两者的大多数值都是 PX ,但 SM 是另一个常见值,还有其他值。

我上面发布的查询将人员和组织中的所有内容标识为 PX 。我想知道是否有一些方法可以将这些额外的站点字段添加到查询中,对其进行修改,以便将表人或组织中的特定行正确识别为PX,SM等。

3 个答案:

答案 0 :(得分:1)

SELECT 'GZ' AS GSiteID, 'Life' AS GSection, GZL.Taxon AS URL
  FROM gz_life GZL WHERE GZL.Taxon = :MyURL
  UNION ALL
  SELECT 'All' AS GSiteID, 'World' AS GSection, GG.Name FROM gw_geog GG WHERE GG.Name = :MyURL
  UNION ALL
  SELECT 'GS' AS GSiteID, 'World' AS GSection, GS.URL FROM gs GS WHERE GS.URL = :MyURL
  UNION ALL
  SELECT Site AS GSiteID, 'People' AS GSection, Ppl.URL FROM people Ppl WHERE Ppl.URL = :MyURL
  UNION ALL
  SELECT Site AS GSiteID, 'Orgs' AS GSection, PXO.URL FROM orgs PXO WHERE PXO.URL = :MyURL

这样,其他三个表(gz_life,gw_geog和gs)将具有默认值,并且将为人员和组织包含表/行特定值。

答案 1 :(得分:1)

我认为你想使用SELECT Site AS GSiteID ....而不是SELECT 'PX' AS GSiteID ...

Select 'Something' as Name只是选择一个硬编码的文字字符串,并为其命名,就像它的列一样。因此,如果您想要实际列,请使用列名(SELECT Site)而不是文字。如果要重命名返回的数据集中的列,Select realcolumnname as newcolumnname ...

答案 2 :(得分:1)

您可以将site添加到每个子查询,并为其分配值NULL,但不使用该子查询:

  SELECT 'GZ' AS GSiteID, NULL as Site, 'Life' AS GSection, GZL.Taxon AS URL
  FROM gz_life GZL WHERE GZL.Taxon = :MyURL
  UNION ALL
  SELECT 'All' AS GSiteID, NULL as Site, 'World' AS GSection, GG.Name FROM gw_geog GG WHERE GG.Name = :MyURL
  UNION ALL
  SELECT 'GS' AS GSiteID, NULL as site, 'World' AS GSection, GS.URL FROM gs GS WHERE GS.URL = :MyURL
  UNION ALL
  SELECT 'PX' AS GSiteID, Site, 'People' AS GSection, Ppl.URL FROM people Ppl WHERE Ppl.URL = :MyURL
  UNION ALL
  SELECT 'PX' AS GSiteID, Site, 'Orgs' AS GSection, PXO.URL FROM orgs PXO WHERE PXO.URL = :MyURL");