繁体   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