我想出了如何在特定数据库表中显示重复值列表...
$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”结尾。但是我不能在这个查询中做到这一点而不会出错。
答案 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;