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