繁体   English   中英

SQL嵌套查询存储在数组中吗?

[英]SQL nested query in stored in an array?

我有一个sql查询,从不同的表中提取一些结果,其中一个表-“ orders”-包含以order_id作为PK的客户详细信息,另一个表-order_products-包含所订购的每个产品,并引用了order_id和另一列作为PK。

基本上,我需要知道如何查询数据库,使得每个order_id仅显示一次,并且将order_products表中的数据添加到同一行中,即使客户已按该特定顺序订购了多个产品。

当前,如果客户订购了多种不同的产品,则会在结果中重复显示客户详细信息-我知道为什么会这样(请参阅查询),但不知道如何以所需的格式输出结果。 我最好的主意是嵌套查询,其中将order_products的结果加载到数组等中,但是我什至不知道这样做是否可行。

我正在使用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);
    }
}

(假设合适的Order类),或在线汇总:

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;
    }
}

当然,上面的细节对于生产代码来说并不是一个好的设计。 print*方法(甚至通过openOrdercloseOrder订单打印)可能应该是OrderWriter,CustomerWriter,AddressWriter和ProductWriter类。 您可能还想使用XMLWriter而不是回显。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM