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