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