2016-02-05 103 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