You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:43:13