【问题标题】:Join rows with different column values连接具有不同列值的行
【发布时间】:2019-03-19 16:01:04
【问题描述】:

我正在制作一个可以使用过滤器的搜索引擎。

我的 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_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';

现在根据用户过滤器输入,我想为它选择正确的位置。 但是因为我使用 LEFT JOIN 连接所有内容,所以我会在不同的行中获得所有过滤器项目,请参见图片。

所以我想选择一个 location_id 同时具有 filter_key FILTER_GRASS 和 FILTER_PARKING 的位置。

如果我使用“AND f.filter_key = 'FILTER_PARKING' AND f.filter_key = 'FILTER_GRASS'”,它将不起作用,因为过滤器值位于单独的行上。

任何人有线索选择location_id同时具有filter_keys的位置吗?

【问题讨论】:

  • 在 ('FILTER_PARKING', 'FILTER_GRASS') 中使用 f.filter_key
  • 谢谢伙计,这成功了!

标签: php mysql sql laravel-5 phpmyadmin


【解决方案1】:

您需要使用Group ByHaving 来过滤位置。

试试:

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'
GROUP BY l.location_id 
HAVING SUM(f.filter_key = 'FILTER_PARKING') AND 
       SUM(f.filter_key = 'FILTER_GRASS')

【讨论】:

  • 谢谢。这确实成功了。让 AND 工作得非常好
  • @Tycho 乐于助人:)
【解决方案2】:

您可以通过使用in 和条件聚合来尝试如下操作

    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

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多