簡體   English   中英

使用 PHP 和 MySQL 按品牌獲取產品總數

[英]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 = ?

由於ANDAND具有更高的優先級,這實際上意味着:

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.

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