簡體   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