簡體   English   中英

PHP MySQL查詢多個類別的多個產品

[英]PHP MySQL query multiple products in multiple categories

我想從數據庫中輸出這樣的內容:

Store name 1
--------------------
Product 1
Product 2

Store name 2
---------------------
Product 3
Product 4

我現在使用的查詢如下所示:

$query_stores = DB::query("SELECT * FROM `stores` LIMIT 16");

foreach($query_stores as $row){

   echo $row['name'] . '<br>';

   $query_products = DB::query("SELECT `id`, `name` FROM `products` WHERE `vendor` = %i ORDER BY RAND() LIMIT 10" , $row['id']);

   foreach($query_products as $row2){
      echo $row2['name'] . '<br>';
   }
}

該代碼工作(某種),但我不能篩選products表中沒有任何項目的stores

輸出示例:

Store name 1

Store name 2
    --------------------
    Product 1
    Product 2

Store name 3

Store name 4
    ---------------------
    Product 3
    Product 4

Store name 5

有沒有更好的方法來運行代碼? 這兩個查詢可以合並嗎?

如何從products表中沒有任何商品的輸出中排除stores

您最好將單個查詢與join語句一起使用,並構建一個數據數組以解析和顯示:

$sql = "SELECT s.id as store_id, s.name as store_name, p.id as product_id, p.name as product_name
            FROM stores s 
            LEFT JOIN products p ON (s.id = p.vendor)
            WHERE p.id IS NOT NULL
            ORDER BY s.name ASC, p.name ASC
            LIMIT 16";
$data = DB::query($sql);

運行查詢后, $data將僅包含具有產品的商店。 LEFT JOIN將確保商店是基本信息,如果商店沒有產品,則產品列將為NULL WHERE子句可確保您過濾掉所有沒有商品的商店。

設置結構化數組將使遍歷數據更加容易。

$stores = []; // or if PHP version < 5.4 array();
foreach($data as $row) {
    if (!array_key_exists($row['store_id'], $stores)) {
        $stores[$row['store_id']] = [
            'store_name' => $row['store_name'],
            'products' => [],
        ];
    }

    $stores[$row['store_id']]['products'][$row['product_id']] = $row['product_name'];
}

並輸出:

foreach ($stores as $store_id => $store) {
    echo $store['name'] .'<br/>';
    foreach ($store['products'] as $product_id => $product_name) {
        echo $product_name .'<br/>';
    }
}

嘗試使用類似的方法對查詢進行重新排序,以便可以檢查存儲是否為空,然后打印是否為空,如果不為空,則不打印。

$query_stores = DB::query("SELECT * FROM `stores` LIMIT 16");

foreach($query_stores as $row){
    // put $query_products in front of echoing  and check if store is empty

    $query_products = DB::query("SELECT `id`, `name` FROM `products` WHERE `vendor` = %i ORDER BY RAND() LIMIT 10" , $row['id']);
    // Here you check if result is empty
    if(mysql_num_rows($query_products) > 0){
        echo $row['name'] . '<br>';   

        foreach($query_products as $row2){
            echo $row2['name'] . '<br>';
        }
    }
}

您可以使用mysql_num_rows(); 函數並檢查結果數是否小於0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM