[英]Get total number of products by brand with multiple categories with PHP and MySQL
我有一個查詢: SELECT brand FROM products WHERE brand='".$brand."' AND category='".$id."'".$categories_list."
這個想法是通過一個類別 ID 或一個品牌編號的 ID 來計算一個類別內或多個類別中的總產品數。
它所在的代碼:
foreach ($product_brands as $brand) {
$products_sql = mysqli_query($mysql_link, "SELECT brand FROM products WHERE brand='".$brand."' AND category='".$id."'".$categories_list."");
$brand_total = @mysqli_num_rows($products_sql);
array_push ($product_brands_count, $brand_total);
}
僅計算單個類別時它可以正常工作。 但是,當嘗試計算多個類別時,它會顯示不正確的計數。
如果顯示了多個類別, $categories_list
會將OR category='".$categories_data['id']."'
添加到查詢中。
我試圖在查詢語句中移動brand='".$brand."'
,但這對我不起作用。
這是我得到的一些計數。
單類:--正確
Brand 1 = 3
Brand 2 = 5
多個類別——不是
Brand 1 = 8
Brand 2 = 11
您的主要問題是邏輯優先級問題。 您正在生成一個where
子句,例如:
WHERE brand = ? AND category = ? OR category = ?
由於AND
比AND
具有更高的優先級,這實際上意味着:
WHERE (brand = ? AND category = ?) OR category = ?
這接受其類別與第二個類別參數匹配的行,無論其品牌如何。
您需要括號來控制優先級:
WHERE brand = ? AND (category = ? OR category = ?)
這可以用IN
縮短:
WHERE brand = ? AND category IN (?, ?)
但最重要的是,我看不出循環遍歷 php 中的品牌,獲取所有行然后計算它們的意義。 您的數據庫可以使用聚合查詢更有效地管理行集。
像這樣的東西應該接近你需要的東西:
select brand, count(*) no_products
from products
group by brand
where category in (?, ?)
請注意,上述所有查詢都是參數化的(即參數未在查詢字符串中連接,而是在execute
時傳遞給查詢)。 您確實希望使用這種技術來提高代碼效率並防止 SQL 注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.