Yii2中按关联表FeatureID数组过滤Property模型的查询异常排查
问题原因与解决方案
问题根源
当前查询用COUNT(*)统计分组后的记录数,一旦Property_Features表中存在同一个PropertyID绑定同一个FeatureID的重复记录,就会出现错误匹配:比如你要找同时包含157和159的Property,但某个Property只绑定了157,却重复绑定了2次,此时COUNT(*)的结果是2,刚好满足HAVING COUNT(*) = 2的条件,就会被错误筛选出来,实际上它并没有包含159这个特征。
修复方案
把统计方式从COUNT(*)改成COUNT(DISTINCT FeatureID),这样统计的是每个PropertyID下不同的FeatureID数量,只有当该Property确实包含所有指定的FeatureID时,统计结果才会等于你传入的FeatureID数组长度。
修改后的Yii2代码
$subquery = (new Query()) ->select(['COUNT(DISTINCT FeatureID)','PropertyID']) ->from('Property_Features') ->where(['in', 'FeatureID', $attributes]) ->groupBy('PropertyID') ->having('COUNT(DISTINCT FeatureID) = ' . count($attributes)) ->limit(12) ->all();
对应的SQL语句
SELECT COUNT(DISTINCT FeatureID), `PropertyID` FROM `Property_Features` WHERE `FeatureID` IN (157, 159) GROUP BY `PropertyID` HAVING COUNT(DISTINCT FeatureID) = 2 LIMIT 12
扩展:关联Property表获取完整数据
如果需要拿到Property表的完整信息,可以先提取子查询中的PropertyID,再查询Property表:
use yii\helpers\ArrayHelper; $targetPropertyIds = ArrayHelper::getColumn($subquery, 'PropertyID'); $properties = Property::find()->where(['PropertyID' => $targetPropertyIds])->all();
内容的提问来源于stack exchange,提问作者Sirick
相关产品推荐
相关产品推荐

