命名一系列子查询(PHP / MySQL)

时间:2014-01-25 02:18:48

标签: php mysql sql

我想出了如何在特定数据库表中显示重复值列表...

$stm = $pdo->prepare("SELECT URL, COUNT(*) tot
 FROM people
 GROUP BY URL
 HAVING tot > 1");
$stm->execute(array(
  'Total'=>$Total
));

while ($row = $stm->fetch())
{
 $URL_Dupe = $row['URL'];
 $tot = $row['tot'];
 $Dupe2[] = ''.$URL_Dupe.''.$tot.'';
}

我想用一系列与UNION ALL子句链接在一起的表做同样的事情......

$stm = $pdo->prepare("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 AS URL FROM gw_geog GG WHERE GG.Name = :MyURL
 UNION ALL
 SELECT 'PX' AS GSiteID, Site, 'People' AS GSection, Ppl.URL FROM people Ppl WHERE Ppl.URL = :MyURL");
$stm->execute(array(
 'MyURL'=>$MyURL
));

换句话说,我想要追踪在一个表中出现多次的单词,或者在两个或多个不同表中出现一次(或更多)的单词。

但我认为我必须首先为所有这些表创建一个名称(例如“Todo”),然后对该名称执行操作,对吧?我怎么做?我有一个类似的表,只是以“AS X”结尾。但是我不能在这个查询中做到这一点而不会出错。

1 个答案:

答案 0 :(得分:2)

您可以将union all查询作为子查询,然后将它们聚合为:

select url, count(*)
from ((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 AS URL
       FROM gw_geog GG WHERE GG.Name = :MyURL
      ) UNION ALL
      (SELECT 'PX' AS GSiteID, Site, 'People' AS GSection, Ppl.URL
       FROM people Ppl WHERE Ppl.URL = :MyURL
      )
     ) t
group by url;

如果你真的想满足条件“我想要追踪在一张桌子上出现不止一次或在两张或更多张不同的牌桌上出现过一次(或更多)的任何字词”。这相当于计数至少为2,因此添加having子句:

select url, count(*)
from ((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 AS URL
       FROM gw_geog GG WHERE GG.Name = :MyURL
      ) UNION ALL
      (SELECT 'PX' AS GSiteID, Site, 'People' AS GSection, Ppl.URL
       FROM people Ppl WHERE Ppl.URL = :MyURL
      )
     ) t
group by url
having count(*) > 1;