php - UNION ALL 查询不匹配的表

标签 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 或 parent 。)

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 和 parent 也将帮助组合查询国家和州(表 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;

最佳答案

您为每个添加静态 Type 的方法是个好主意。它只需要用像

这样的单引号字符串文字来完成
SELECT 'region' AS Type

SELECT 列表中。

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

SELECT NULL AS IDArea

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

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

/* 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

关于php - UNION ALL 查询不匹配的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726295/

相关文章:

c# - 创建数据库连接错误NUnit c#

php - 根据多个文件输入检查现有文件名

php - 如何从这种URL获取主机名?

PHP 和百万数组宝贝

php - 如何以编程方式更改 Wordpress 中的菜单?

mysql - 从外部删除mysql中的表

java - 将 DatePicker 中的数据添加到 DB Javafx 中

php - 存储上传的文件,MySQL 还是文件路径?

database - Vars to cases & retain variable/value labels Tableau setup - 为 Tableau 重组数据,翻转数据

c# - .NET Framework 4 中数据库的缓存数据列表