2016-02-05 55 views
0

enter image description hereSql查询搜索结合表中的多个匹配

你好,我有两个表和一个联结表。我想找到所有的房产,有一个或多个舒适。我写此查询(postrgreSql):

SELECT DISTINCT "estates".* 
FROM "estates" 
     LEFT JOIN "estate_comforts" 
       ON "estates"."id" = "estate_comforts"."estate_id" 
WHERE "estate_comforts"."comfort_id" IN ('1', '2') 

它找到具有第一舒适或第二屋,但我需要“与”的方式进行搜索。

enter image description here

该项目使用Yii2 framewors,所以普通的SQL或ActiveRecord的说法是可以接受的。

更新。此查询选择所有esates,无论是舒适的

SELECT DISTINCT "estates".* 
FROM "estates" 
     LEFT JOIN "estate_comforts" 
       ON "estates"."id" = "estate_comforts"."estate_id" 
AND "estate_comforts"."comfort_id" IN ('1', '2') 
+0

您在这里同时使用MySQL和Postgresql吗?请不要标记不涉及的产品。 – jarlh

+0

不,我使用yii2 ActiveRecord与Postgres并从日志中复制查询。我可以给代码,而不是产生这个查询,但它是否有必要? – Skav

+0

跳过WHERE子句,执行'AND“estate_comforts”。“comfort_id”IN('1','2')'获得真正的左连接行为! – jarlh

回答

2

要么JOIN estate_comforts两次,一次用于comfort_id 1,另一次为comfort_id 2:

SELECT DISTINCT "estates".* 
FROM "estates" 
    INNER JOIN "estate_comforts" ec1 
      ON "estates"."id" = ec1."estate_id" 
    INNER JOIN "estate_comforts" ec2 
      ON "estates"."id" = ec2."estate_id" 
WHERE ec1."comfort_id" = '1' 
    AND ec2."comfort_id" = '2' 

另外,在estate_comforts做GROUP BY使用至少两个不同的comfort_id值查找estate_id。加入结果:

select e.* 
from "estates" e 
    join (select "estate_id" 
     from "estate_comforts" 
     WHERE "comfort_id" IN ('1', '2') 
     group by "estate_id" 
     having count(distinct "comfort_id") >= 2) ec ON e."id" = ec."estate_id" 
+0

这个查询按我的预期工作!谢谢! – Skav

+0

第二个查询不按预期工作。首先,'estates'表中没有'estate_id'字段,所以它在'on clause'中给出错误'未知列'e.estate_id',但是如果将其更改为'id',查询会给我所有的属性,无论舒适。 – Skav

+0

对不起,本来是要返回所有至少有两个不同comfort_id的屋,不管哪个屋。增加了一个WHERE。 – jarlh