在SQL查询中创建foreach循环,还是通过PHP动态执行?

在SQL查询中创建foreach循环,还是通过PHP动态执行?,php,sql,pdo,Php,Sql,Pdo,我的数据库中有两张表,多页图片和插图。多面体的PK在插图中为FK。 我想做的是: SELECT polyptychID FROM Polyptychs 随后,foreach ID返回我需要所有插图。 通过PHP,解决方案如下(使用PDO sintax): 现在$final_result包含所有polyptychID作为数组键及其相关图像和插图(如果代码中没有错误)。 我想知道的是,是否有一种更简单的方法来获取它,可能是通过SQL实现的,以及什么是最好的解决方案。 谢谢如果我是你,我会这么做

我的数据库中有两张表,多页图片和插图。多面体的PK在插图中为FK。 我想做的是:

SELECT polyptychID FROM Polyptychs
随后,foreach ID返回我需要所有插图。 通过PHP,解决方案如下(使用PDO sintax):


现在
$final_result
包含所有
polyptychID
作为数组键及其相关图像和插图(如果代码中没有错误)。 我想知道的是,是否有一种更简单的方法来获取它,可能是通过SQL实现的,以及什么是最好的解决方案。
谢谢

如果我是你,我会这么做:

SELECT p.polyptychID as ID,
    p.polyptych_image as image,
    i.*
FROM Polyptychs p
INNER JOIN Illustrations i
    ON i.polyptychID = p.polyptychID
根据您的评论,查看此方便的图表,了解我选择在此处使用
内部联接的原因:

然后,要按您想要的方式格式化数组,只需编写以下内容:

$formatted = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    $id = $row['ID'];
    if (!isset($formatted[$id]))
    {
        $formatted[$id] = array(
            'image' => $row['image'],
            'illustrations' => array() //we'll set this in a minute
        );
    }
    unset($row['ID'], $row['image']);//remove id & image values
    $formatted[$id]['illustrations'][$row['illustrationsID']] = $row;//assign rest of result-set
}
当然,如果
插图中有名为
ID
image
的字段,则必须将查询更改为
p.polyptychID AS p_ID
或其他内容。只要确保别名是唯一的,你就没事了

关于重复使用准备好的陈述,这似乎是人们容易忽视的,但你确实可以反复使用同样的准备好的陈述。幸运的是,事实上,我。我使用了一些可能也适用于您的案例的基本示例。因此,如果出于某种原因,您不能进行连接,您可以简单地编写:

$stmt = $pdo->prepare(
    'SELECT * FROM Illustrations WHERE polyptychID = :pId'
);
$baseStmt = $pdo->query(
    'SELECT polyptychID, polyptych_image FROM Polyptychs'
);
$result = array()
while($row = $baseStmt->fetch(PDO::FETCH_ASSOC))
{
    $result[$row['polyptychID']] = array(
        'image' => $row['polyptych_image'],
        'illustrations' => null
    );
    $stmt->execute( array(':pId' => $row['pId']));
    $result[$row['polyptychID']]['illustrations'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

您可以使用内部联接仅运行一个查询:

SELECT P.polyptychID, polyptych_image, I.* 
FROM Polyptychs P
INNER JOIN Illustrations I ON I.polyptychID = p.polyptychID
现在,将结果循环添加到相同的数组结构
polyptychID
作为键和
插图
作为数组:

<?php
$sql = "SELECT P.polyptychID, polyptych_image, I.* 
        FROM Polyptychs P
        INNER JOIN Illustrations I ON I.polyptychID = p.polyptychID";
$stmt = $this->DBH->query($sql);
$resultTmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
$final_result  = array();
foreach($resultTmp as $val){
    $id = $val['polyptychID'];
    $final_result["$id"]["image"] = $val['polyptych_image'];
            // I'm not sure what's the ID for Illustration table, so I'll assume `illustrationID`
    $final_result["$id"]["illustrations"][$val["illustrationID"]] = $val;
    unset($id);
}
?>

连接有什么问题吗?为什么
prepare
一次又一次地重复使用同一个查询,为什么不重复使用一个已准备好的语句呢?是否有理由不能在一个查询中执行此操作,并将结果分组到PHP端<代码>从Polypytchs中选择P.polypytchhid,P.polypytchh_imge,I.*作为P.polypytchid=I.polypytchid上的P左外连接插图?为什么两个表中都有图像?因为它们不是相同的图像。PlantTheIdea带有左连接然后我在表中有一个没有多联的插图,多联字段中的值为NULL,需要通过PHP过滤结果。@Andrea_86:然后不要使用左连接的
左连接,这允许在左连接的表中使用
NULL
,而使用
内部连接
,正如我在回答中解释的那样,$final_result[“$id”][“插图”][]=$val;没有钥匙?!?此外,我重新写入了更多次$final_result[“$id”][“image”],因为所有具有相同$id的行都具有相同的图像,一个wasteSorry@Andrea_86,只是将其设置(假定的)
illustrationID
作为
illustrations
数组的键。我不明白为什么以后分配['illustrations'],多行对同一幅多页画有不同的插图,通过这种方式,您只需存储最后一个['插图]@Andrea_86:我稍后分配它,以从结果数组中取消设置
图像
ID
位。首先,我将编辑我的答案,以避免重新分配
插图
键,尽管概述不错,谢谢。“重复使用准备好的语句”可能只是一个输入错误,第二个准备是$sql2变量。@Andrea_86:什么打字错误?我在循环外准备一条语句,然后在循环中简单地重复使用它。这表明您不必反复调用prepare,只需在
PDOStatement
实例上调用
execute
,传递新值,就完成了:
prepare
调用的开销减少了好的,我不明白您的意思……是的,您是对的,我快速编写代码只是为了解释我的问题,没有考虑优化它
<?php
$sql = "SELECT P.polyptychID, polyptych_image, I.* 
        FROM Polyptychs P
        INNER JOIN Illustrations I ON I.polyptychID = p.polyptychID";
$stmt = $this->DBH->query($sql);
$resultTmp = $stmt->fetchAll(PDO::FETCH_ASSOC);
$final_result  = array();
foreach($resultTmp as $val){
    $id = $val['polyptychID'];
    $final_result["$id"]["image"] = $val['polyptych_image'];
            // I'm not sure what's the ID for Illustration table, so I'll assume `illustrationID`
    $final_result["$id"]["illustrations"][$val["illustrationID"]] = $val;
    unset($id);
}
?>