SQL bir dizide saklanan sorgu iç içe?

3 Cevap php

"Emir" - - Ben farklı tablolar, tablolardan birinden birkaç sonuç çekerek bir sql sorgusu var bir PK gibi bir order_id ile müşteri bilgilerini içeren, başka bir tablo - order_products - order_id referans ve başka bir sütun ile, sipariş edilen her ürün içeriyor olarak PK.

Temelde, ben, müşterilerin belli bir düzen içinde birden fazla ürünü sipariş etmiş olsa bile, aynı satır içinde ilave order_products tablodan verilerle, her order_id yalnızca bir kez görüntülenir böyle bir şekilde veritabanını sorgulamak için bilmek gerekir.

Onlar çok farklı ürünler sipariş varsa şu anda müşteri bilgilerini sonuçları içinde tekrarlanan ediliyor - Ben Bu neden oluyor biliyor (sorgu), ancak istenilen formatta sonuç çıktı almak için nasıl bilmiyorum. Benim iyi fikir order_products gelen sonuçlar bir dizi falan yüklenen olduğu, iç içe sorgu olurdu ama bu mümkün olsaydı ben bile bilmiyorum.

Sonra bir XML belgesinde çıkış olması için sonuçları ile MySQL ve PHP kullanıyorum. Eğer daha fazla bilgi gerekiyorsa isteyin!

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

3 Cevap

Ilişkisel veritabanlarının temel ilkelerinden biri sütunları hiçbir diziler demektir, bileşik veri tutmaz olmasıdır. Aynı zamanda "first normal form" (1nf) denir. Eğer ürün sorgusu içinde tekrar sipariş bilgisi istemiyorsanız, iki sorgu yerine birini, ürün alır emir alır bir ve ikinci çalıştırabilirsiniz.

Sorgunun sonucu zaten işleniyor beri sonuç almak bir kez, aynı zamanda PHP içinde toplanmasının bakabilirim. Önce araya yapabilirsiniz:

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

(Uygun Order sınıf varsayarak) veya toplu-line:

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

Tabii ki, Yukarıdakilerin özelliklerini üretim kodu için iyi bir tasarım değildir. print* yöntemleri (ve hatta sipariş baskı, openOrder ve üzeri closeOrder) muhtemelen OrderWriter, CustomerWriter, AddressWriter ve ProductWriter sınıfları olmayı hak ediyor. Ayrıca XMLWriter yerine yankılanan daha kullanmak isteyebilirsiniz.

Sen sipariş kimliği kabul etmek ve bir dize sipariş edilen ürünlerin bir listesini dönmek bir kullanıcı tanımlı işlevi oluşturabilirsiniz. Yerine uc_order_products tablo ile katılma Sonra, sadece UDF diyoruz. Umarım bu yardımcı olur.

Bu bir usul görev ve PHP veya başka bir dil (sizin için dizi döndürür bir db prosedür olabilir) kullanarak sonuç kümesini işleme gerektirir.