Php 连接具有不同列值的行
我正在做一个可以使用过滤器的搜索引擎 我的SQL看起来像这样Php 连接具有不同列值的行,php,mysql,sql,laravel-5,phpmyadmin,Php,Mysql,Sql,Laravel 5,Phpmyadmin,我正在做一个可以使用过滤器的搜索引擎 我的SQL看起来像这样 SELECT l.location_id, og.*,f.* FROM object_types ot LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_g
SELECT l.location_id, og.*,f.*
FROM object_types ot
LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
LEFT JOIN filters f ON f.filter_id = og2f.filter_id
LEFT JOIN locations l ON l.location_id = og.location_id
WHERE ot.object_type_key = 'TYPE_TENNIS';
现在根据用户过滤器输入,我想为它选择正确的位置。
但因为我用左连接所有东西,所以我得到了不同行上的所有过滤器项,见图
所以我想选择一个位置,在这个位置上,一个位置id既有filter\u key filter\u GRASS又有filter\u PARKING
如果我使用“AND f.filter\u key='filter\u PARKING'和f.filter\u key='filter\u GRASS'”,它将不起作用,因为过滤器值位于不同的行上
任何人都有线索可以选择位置id同时具有两个筛选键的位置吗?您需要使用
分组依据和具有来筛选出位置
尝试:
您可以使用
中的和条件聚合来尝试下面的方法
SELECT l.location_id
FROM object_types ot
LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
LEFT JOIN filters f ON f.filter_id = og2f.filter_id
LEFT JOIN locations l ON l.location_id = og.location_id
WHERE ot.object_type_key = 'TYPE_TENNIS'
and f.filter_key in ('FILTER_PARKING','FILTER_GRAS')
GROUP BY l.location_id
HAVING SUM(case when f.filter_key = 'FILTER_PARKING' then 1 else 0 end)>=1 AND
SUM(case whenf.filter_key = 'FILTER_GRAS' then 1 else 0 end)>=1
使用f.filter_键(‘filter_PARKING’、‘filter_GRASS’)谢谢,伙计,这就成功了!非常感谢。这确实奏效了。有一个真正的锻炼计划well@Tycho乐意帮忙:)
SELECT l.location_id
FROM object_types ot
LEFT JOIN object_group_types ogt ON ogt.object_type_id = ot.object_type_id
LEFT JOIN object_groups og ON og.object_group_type_id = ogt.object_group_type_id
LEFT JOIN object_groups2filters og2f ON og2f.object_group_id = og.object_group_id
LEFT JOIN filters f ON f.filter_id = og2f.filter_id
LEFT JOIN locations l ON l.location_id = og.location_id
WHERE ot.object_type_key = 'TYPE_TENNIS'
and f.filter_key in ('FILTER_PARKING','FILTER_GRAS')
GROUP BY l.location_id
HAVING SUM(case when f.filter_key = 'FILTER_PARKING' then 1 else 0 end)>=1 AND
SUM(case whenf.filter_key = 'FILTER_GRAS' then 1 else 0 end)>=1