2014-01-24 60 views
0

我有一系列与各种网站和部分相对应的数据库表格 - 例如, MySite/World,MySite2/World,MySite3/People等。向UNION ALL查询添加额外的字段

我将所有这些项目合并到一个新的网站。但为了使项目正常工作,我需要在我的查询中保留每个数据库表的标识 - 每个数据库表的原始网站和部分的名称。在另一个线程中,stackoverflow上的某个人向我展示了如何从数据库表中导出静态值(例如,选择'GZ'作为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()) 
{ 

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

因此,表人和机构单位有一个名为网站一个额外的字段。两者的大部分值都是PX,尽管SM是另一个常见值,还有其他值。

我上面发布的查询标识表中的人物和组织的一切为PX。我想知道是否有某种方式,我可以添加这些额外的站点字段添加到查询,修改它,以便从表中的人或组织被正确地识别为PX,SM等

回答

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"); 
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

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

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