Php SQL嵌套查询是否存储在数组中?

Php SQL嵌套查询是否存储在数组中?,php,sql,mysql,Php,Sql,Mysql,我有一个sql查询,从不同的表中提取一些结果,其中一个表“orders”包含客户详细信息,订单id作为主键,另一个表“order\u products”包含每个订购的产品,参考订单id和另一列作为主键 基本上,我需要知道如何查询数据库,以便每个订单id只显示一次,来自订单产品表的数据添加到同一行中,即使客户在该特定订单中订购了多个产品 目前,如果客户订购了多个不同的产品,则会在结果中重复客户详细信息-我知道发生这种情况的原因(请参见查询),但不知道如何以所需格式获得结果输出。我最好的想法是使用嵌

我有一个sql查询,从不同的表中提取一些结果,其中一个表“orders”包含客户详细信息,订单id作为主键,另一个表“order\u products”包含每个订购的产品,参考订单id和另一列作为主键

基本上,我需要知道如何查询数据库,以便每个订单id只显示一次,来自订单产品表的数据添加到同一行中,即使客户在该特定订单中订购了多个产品

目前,如果客户订购了多个不同的产品,则会在结果中重复客户详细信息-我知道发生这种情况的原因(请参见查询),但不知道如何以所需格式获得结果输出。我最好的想法是使用嵌套查询,将order_产品的结果加载到数组或其他东西中,但我甚至不知道这是否可行

我正在使用MySQL和PHP,结果将输出到XML文档中。如果您需要更多信息,请询问

SELECT uc_orders.order_id, uc_orders.order_total, uc_orders.primary_email, 
    uc_orders.delivery_first_name, uc_orders.delivery_last_name, 
    uc_orders.delivery_street1, uc_orders.delivery_street2, uc_orders.delivery_city, 
    uc_orders.delivery_zone, uc_orders.delivery_postal_code, uc_zones.zone_name, 
    uc_order_products.title, uc_order_products.price 
  FROM uc_orders 
    LEFT JOIN uc_zones ON uc_orders.delivery_zone = uc_zones.zone_id 
    LEFT JOIN uc_order_products ON uc_orders.order_id = uc_order_products.order_id 
  ORDER BY order_id

关系数据库的基本原则之一是列不包含复合数据,这意味着没有数组。它也被称为“(1NF)。如果不希望在产品查询中重复订单信息,可以运行两个查询,而不是一个查询,一个查询获取订单,另一个查询获取产品

由于查询结果仍在处理中,因此在获得结果后,还可以在PHP中进行聚合。您可以首先聚合:

$orders=array();
while ($row = $result->fetch()) {
    if (! isset($orders[$row['order_id']])) {
        $orders[$row['order_id']] = new Order($row);
    } else {
        $orders[$row['order_id']]->addProducts($row);
    }
}
(假设有合适的订单类别),或在线聚合:

class OrderList {
    ...
    function printXML($result) {
       $currOrderID = null;
       echo '<orders>'
       while ($row = $result->fetch()) {
           if ($currOrderID != $row['order_id']) {
               $this->closeOrder();
               $this->openOrder($row);
           }
           $this->printProduct($row);
       }
       $this->closeOrder();
       echo '</orders>';
    }

    function openOrder($row) {
        echo "<order id='$row[order_id]'><total>$row[order_total]</total>";
        $this->printCustomer($row);
        echo '<products>';
    }

    function printProduct($row) {
        echo "<product><title>$row[title]</title><price>$row[price]</price></product>\n";
    }

    function closeOrder() {
        echo '</products></order>';
    }

    function printCustomer($row) {
        echo <<EOS;
          <customer>
            <email>$row[primary_email]</email>
            <first_name>$row[delivery_first_name]</first_name>
            ...
EOS;
        $this->printAddress($row);
        echo '</customer>';
    }

    function printAddress($row) {
        echo <<EOS;
          <address>
            <street line="1">$row[delivery_street1]</street>
            <street line="2">$row[delivery_street2]</street>
            ...
          </address>
EOS;
    }
}
类订单列表{
...
函数printXML($result){
$currOrderID=null;
回声“
而($row=$result->fetch()){
如果($currOrderID!=$row['order\u id'])){
$this->closeOrder();
$this->openOrder($row);
}
$this->printProduct($row);
}
$this->closeOrder();
回声';
}
函数openOrder($row){
回显“$行[订单总数]”;
$this->printCustomer($row);
回声';
}
函数printProduct($row){
回显“$行[标题]$行[价格]\n”;
}
函数closeOrder(){
回声';
}
函数printCustomer($row){

echo关系数据库的基本原则之一是列不包含复合数据,这意味着没有数组。它也被称为“”(1NF)。如果您不想在产品查询中重复订单信息,可以运行两个查询,而不是一个查询,一个查询获取订单,另一个查询获取产品

由于查询结果仍在处理中,因此您还可以在获得结果后在PHP中进行聚合。您可以首先聚合:

$orders=array();
while ($row = $result->fetch()) {
    if (! isset($orders[$row['order_id']])) {
        $orders[$row['order_id']] = new Order($row);
    } else {
        $orders[$row['order_id']]->addProducts($row);
    }
}
(假设有合适的订单类别),或在线聚合:

class OrderList {
    ...
    function printXML($result) {
       $currOrderID = null;
       echo '<orders>'
       while ($row = $result->fetch()) {
           if ($currOrderID != $row['order_id']) {
               $this->closeOrder();
               $this->openOrder($row);
           }
           $this->printProduct($row);
       }
       $this->closeOrder();
       echo '</orders>';
    }

    function openOrder($row) {
        echo "<order id='$row[order_id]'><total>$row[order_total]</total>";
        $this->printCustomer($row);
        echo '<products>';
    }

    function printProduct($row) {
        echo "<product><title>$row[title]</title><price>$row[price]</price></product>\n";
    }

    function closeOrder() {
        echo '</products></order>';
    }

    function printCustomer($row) {
        echo <<EOS;
          <customer>
            <email>$row[primary_email]</email>
            <first_name>$row[delivery_first_name]</first_name>
            ...
EOS;
        $this->printAddress($row);
        echo '</customer>';
    }

    function printAddress($row) {
        echo <<EOS;
          <address>
            <street line="1">$row[delivery_street1]</street>
            <street line="2">$row[delivery_street2]</street>
            ...
          </address>
EOS;
    }
}
类订单列表{
...
函数printXML($result){
$currOrderID=null;
回声“
而($row=$result->fetch()){
如果($currOrderID!=$row['order\u id'])){
$this->closeOrder();
$this->openOrder($row);
}
$this->printProduct($row);
}
$this->closeOrder();
回声';
}
函数openOrder($row){
回显“$行[订单总数]”;
$this->printCustomer($row);
回声';
}
函数printProduct($row){
回显“$行[标题]$行[价格]\n”;
}
函数closeOrder(){
回声';
}
函数printCustomer($row){

echo您可以创建一个用户定义的函数,该函数将接受订单id并返回一个字符串形式的已订购产品列表。然后,您只需调用UDF即可,而不必加入uc_order_products表。希望这会有所帮助。

您可以创建一个用户定义的函数,该函数将接受订单id并返回s形式的已订购产品列表tring.然后,您只需调用UDF,而不是加入uc_order_products表。希望这有帮助。

这是一个过程性任务,需要使用PHP或其他语言处理结果集(可能是为您返回数组的db过程).

这是一个过程性任务,需要使用PHP或其他语言处理结果集(可能是为您返回数组的db过程).

感谢您的详细回复-我正在使用DOM来处理XML内容。我将尝试调整您的示例以适合我的项目。请牢记我对*Writer类的建议。我很想更改示例。感谢您的详细回复-我正在使用DOM来处理XML内容。我将尝试h根据我的项目调整你的例子。请牢记我对*Writer类的建议。我很想改变这个例子。