[英]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.