UNION ALL查询不匹配的表格

时间:2014-11-04 01:28:46

标签: php mysql database

我正在使用以下查询来显示动态页面,其中页面URL是存储在两个数据库表中的值:

$sql = "SELECT SUM(num) as num FROM (
 SELECT COUNT(URL) AS num FROM gw_geog WHERE URL = :MyURL
 UNION ALL
 SELECT COUNT(URL) AS num FROM gw_world_urls WHERE URL = :MyURL
) AS X";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':MyURL',$MyURL,PDO::PARAM_STR);
$stmt->execute();
$Total = $stmt->fetch();

我将收到四到五张桌子,上面有更详细的信息。我想为每个表编写单独的查询,因为每个表都有一些不同。但我首先需要一个中间查询来获取一些信息。

所以我尝试将以下查询转换为另一个UNION ALL查询,但它无效。

$stm = $pdo->prepare("SELECT GG.N, GG.IDArea MyID, GG.URL, GG.IDParent
 FROM gw_geog GG
 WHERE GG.URL LIKE :XURL");
$stm->execute(array(
'XURL'=>$XURL
));

有人能告诉我如何使用UNION ALL查询名为gw_geog,gw_geog_regions和gw_geog_landforms的三个表,其中每个表都有名为URL和IDParent的字段,但只有gw_geog有一个名为IDArea的字段?

这是我想做的事情:

1)从表格gw_geog中获取每个国家/地区的ID(IDArea)和父级(IDParent)。 (我不需要其他查询的ID或父母。)

2)根据源表为每一行赋值。例如,包含值'russia'的行存储在表gw_geog中。所以我希望它有一个类似$ Type ='country'的值。值为'midwest'和'amazon-river'的行来自表gw_geog_regions和gw_geog_landforms。所以我希望gw_geog_regions的每一行都有$ Type ='region'的值,而gw_geog_landforms的每一行都是$ Type ='landform'。

如果我可以获得每行的“类型”(例如国家,地区或地形),它将帮助我创建一个针对该类别的查询。 ID和父母也将帮助汇总国家和州的查询(表格gw_geog)。

更新

我一直在玩我的新查询,但我无法弄清楚我做错了什么。我已经修改了一些表,所以有一些变化。但它不显示$ IDParent或$ Type X的任何值,print_r($ row)也不显示任何值。谁能看到我做错了什么?

$stm = $pdo->prepare("SELECT *
FROM (
 SELECT URL, IDArea, IDParent, 'country' AS TypeX FROM gw_geog
 UNION ALL
 SELECT URL, IDArea, IDParent, 'region' AS TypeX FROM gw_geog_regions
 UNION ALL 
 SELECT URL, IDArea, IDParent, 'landform' AS TypeX FROM gw_geog_landforms
) AS Combined
WHERE Combined.URL LIKE :XURL");
$stm->execute(array(
'XURL'=>$XURL
));

while ($row = $stm->fetch())
{
 $IDParent = $row['IDParent'];
 $TypeX = $row['TypeX'];  
 print_r($row);
}
print_r($row);
echo $TypeX;
echo $IDParent;

2 个答案:

答案 0 :(得分:1)

教科书的答案是从包含这些列的表中选择A,B,C,然后从缺少的表中选择A,B,NULL。考虑创建一个实现联合的视图,这样您就可以保持业务逻辑的简单。

答案 1 :(得分:1)

为每个人添加静态Type的方法是个好主意。它只需要使用单引号字符串文字,如

SELECT 'region' AS Type

SELECT列表中。

要使用缺少IDArea的表格,请在NULL列表中查询SELECT代替该列:

SELECT NULL AS IDArea

可以使用UNION s或字符串文字的组合在不匹配的表之间填写NULL查询,以确保列全部对齐。

所以你的完整查询看起来像

/* Literal string (single-quoted) 'country','region','landform' aliased as `Type` */
SELECT URL, IDArea, IDParent, 'country' AS Type FROM gw_geog
UNION ALL
/* NULL in place of IDArea */
SELECT URL, NULL AS IDArea, IDParent, 'region' AS Type FROM gw_geog_regions
UNION ALL 
/* NULL in place of IDArea */
SELECT URL NULL AS IDArea, IDParent, 'landform' AS Type FROM gw_geog_landforms

如果将所有子句作为子查询包含在内,则可以在外部应用WHERE子句:

SELECT *
FROM (
    SELECT URL, IDArea, IDParent, 'country' AS Type FROM gw_geog
    UNION ALL
    SELECT URL, NULL AS IDArea, IDParent, 'region' AS Type FROM gw_geog_regions
    UNION ALL 
    SELECT URL NULL AS IDArea, IDParent, 'landform' AS Type FROM gw_geog_landforms
) AS combined
WHERE combined.URL LIKE :XURL