我使用以下查询来显示动态页面,其中页面 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/