Php 对不匹配表的UNION ALL查询

Php 对不匹配表的UNION ALL查询,php,mysql,database,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); $

我使用以下查询来显示动态页面,其中页面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();
最后我会有四到五张桌子,上面有更详细的信息。我想为每个表编写单独的查询,因为每个表都有点不同。但我首先需要一个中间查询来获取一些信息

因此,我尝试将以下查询转换为另一个UNIONALL查询,但它不起作用

$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_Lanforms的三个表,其中每个表都有名为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_地貌。因此,我希望gw_geog_regions中的每一行都有$Type='region'的值,而gw_geog_地貌中的每一行都是$Type='groupation'

如果我可以为每一行获取一个类型,例如国家、地区或地形,它将帮助我创建一个针对该类别的查询。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;

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

您为每个视图添加一个静态类型的方法是一个好主意。它只需要使用单引号字符串文本,如

SELECT 'region' AS Type
在选择列表中

要使用缺少IDArea的表,请在选择列表中查询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子句全部作为子查询括起来,则可以在外部应用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

对于第一个查询,为什么不运行两个查询并用PHP对结果求和?@michaelberkowski-Awesome;你还回答了我更新帖子时提出的第二个问题。不过有一个问题——我创建了新的查询,在查询之后,我输入了echo$Type。但我得到一个未定义的变量错误消息。我必须在while循环中定义$Type吗?通常,我会在while fetch循环中放入类似$Type=row['Type']的内容,但我不知道如何为这个复合查询编写它。即使我们添加了它,但它不是一个真正的列,就查询输出而言,它的行为与真正的表列完全相同。如果在fetch循环中打印\r$row,您应该会在那里看到它。Hmmm…$Type=$row['Type']不起作用,而print\r$row不显示任何内容。我要玩一会儿;也许我只是做错了什么。首先在MySQL客户机中测试它,脱离PHP代码的上下文,以确保得到预期的结果。然后找出如何从中提取。
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