gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:23:17 25 4
gpt4 key购买 nike

我有一个 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

最佳答案

关系数据库的基本原则之一是列不保存复合数据,这意味着没有数组。它也称为“first normal form”(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而不是 echo 。

关于php - SQL嵌套查询存储在数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1749876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com