MySQL在何处有条件

MySQL在何处有条件,mysql,sql,Mysql,Sql,几个小时来,我一直在用这个问题碰壁,我想我会在这里碰碰运气的 我正在处理一个查询,它返回基于类别和类别评级的产品 简化的模式如下所示: 产品 id 名称 价格 类别 id 名字 产品类别 产品标识 类别标识 评级(0-5) 我目前的查询如下: SELECT `products` . *, products_categories.* FROM `products` JOIN `products_categories` ON (`products`.`id` = `products_cat

几个小时来,我一直在用这个问题碰壁,我想我会在这里碰碰运气的

我正在处理一个查询,它返回基于类别和类别评级的产品

简化的模式如下所示:

产品
id
名称
价格

类别
id
名字

产品类别
产品标识
类别标识
评级(0-5)

我目前的查询如下:

SELECT 
`products` . *, products_categories.*
FROM
`products`
    JOIN
`products_categories` ON (`products`.`id` = `products_categories`.`product_id`)
WHERE
`products_categories`.`category_id` IN ('5' , '24', '41')
    AND `products_categories`.`rating` > 1
    AND `products`.`enabled` = 1
HAVING count(distinct (products_categories.category_id)) = 3
ORDER BY `amount` ASC
LIMIT 9 OFFSET 0
查询的第一部分是选择属于这3个类别的所有产品,这3个类别工作正常,但是,我正在努力解决的部分是评级部分

我需要查询选择属于这3个类别的所有产品,如果类别的评级为1或更高。目前,查询只对返回虚假结果的最后一个类别的评级进行操作

任何意见都将受到极大的赞赏,即使只是方向正确的一点


干杯。

您需要一个
groupby
子句,这样
COUNT()
将按产品计数,而不是一次计算所有内容

SELECT 
`products` . *, products_categories.*
FROM
`products`
    JOIN
`products_categories` ON (`products`.`id` = `products_categories`.`product_id`)
WHERE
`products_categories`.`category_id` IN ('5' , '24', '41')
    AND `products_categories`.`rating` > 1
    AND `products`.`enabled` = 1
GROUP BY products.id
HAVING count(distinct (products_categories.category_id)) = 3
ORDER BY `amount` ASC
LIMIT 9 OFFSET 0

哇,我真不敢相信我错过了——感觉自己像个傻瓜。非常感谢Barmar!我会接受这个答案,当它允许我。再次感谢。MySQL将允许您在没有分组依据的情况下运行此查询,这让我很伤心。是的,我也无法相信MySQL让您在没有实际指定
分组依据的情况下对聚合函数进行操作,这是允许的,因为有时您希望对整个结果集进行操作,例如
选择计数(*)从表中,rating=3
。由于product_id似乎是products表的外键-并且您在product.id级别进行分组,因此使用products_类别没有任何意义。*在select子句中-如果没有显式分组,它将从该表返回一个不可指示的行。