2017-10-13 100 views
-2

我有一個名爲VIEW的評論,與汽車表有關,汽車表與表標籤有多對多的關係(通過名爲cars_tags的連接表),但是什麼我需要的是檢索與某些標籤相關的汽車評論,並同時與另一個標籤相關。我今天是下面的SQL代碼:Postgresql選擇相關標籤(多對多)

SELECT "cars"."review".* 
FROM "cars"."review" 
LEFT JOIN cars.cars ON (cars.review.car_id = cars.cars.id) 
LEFT JOIN cars.makes ON (cars.cars.make_id = cars.makes.id) 
LEFT JOIN cars.cars_tags ON (cars.cars.id = cars.cars_tags.car_id) 
LEFT JOIN cars.tags ON (cars.cars_tags.tag_id = cars.tags.id) 
WHERE (cars.tags.id IN ('91782e95-8c5d-4254-82ab-b11a21306c18')) 
AND (cars.tags.id IN ('031cec30-df27-471e-858d-53c3d9657c8a')) 
ORDER BY "cars"."review"."score" DESC LIMIT 100 

此SQL給我帶來了沒有結果,但我相信,有現車至極都與第一ID:「91782e95-8c5d-4254-82ab-b11a21306c18」 AND'031cec30-df27-471e-858d-53c3d9657c8a'同時...我做錯了什麼?

感謝

+0

您的查詢說的是「只帶回'結果'cars.tags.id'在'917 ...'和'cars.tags.id'在'031 ...'同時」 。當然,沒有一個標籤可以同時成爲兩件不同的事情!在('917 ...','031 ...')中嘗試使用'cars.tags.id',這有效地說明了「帶回匹配*這些條件之一的標籤」 – user1935361

+0

但是正是我需要的是結果這與一個ID和其他ID在同一時間有關 –

+0

我誤解了你 - 什麼都不能滿足X ='A'和X ='B'。 「相關」是什麼意思?編輯:等等,我想我明白了,給我一分鐘 – user1935361

回答

0

bool_or

select r.col1, r.col2 
from 
    cars.review r 
    left join 
    cars.cars on r.car_id = cars.id 
    inner join 
    cars.cars_tags on cars.id = cars_tags.car_id 
    inner join 
    cars.tags on cars_tags.tag_id = tags.id 
group by r.col1, r.col2 
having 
    bool_or (tags.id = '91782e95-8c5d-4254-82ab-b11a21306c18') 
    and 
    bool_or (tags.id = '031cec30-df27-471e-858d-53c3d9657c8a') 
order by r.score desc 
limit 100 

exists版本:

select col1, col2 
from cars.review 
where exists (
    select 1 
    from 
     cars.cars 
     inner join 
     cars.cars_tags on cars.id = cars_tags.car_id 
     inner join 
     cars.tags on cars_tags.tag_id = tags.id 
    where review.car_id = cars.id 
    group by 1 
    having 
     bool_or (tags.id = '91782e95-8c5d-4254-82ab-b11a21306c18') 
     and 
     bool_or (tags.id = '031cec30-df27-471e-858d-53c3d9657c8a') 
) 
order by score desc 
limit 100 
+0

這工作正常,但我有太多的表上的字段使用分組爲每個表。但是,謝謝,我會用那個 –

+0

@AndréCavallari檢查'存在'版本 –

+0

工作很好,謝謝你的夥計! –

0

從我瞭解你感興趣的評論爲具有2個特定標籤一輛車。

這可以通過下面的查詢完成。我已經刪除了cars.make的引用,因爲您沒有從中檢索任何數據。我還刪除了cars.tags的引用,因爲您使用的唯一信息是cars_tags表中的標記ID。

SELECT "cars"."review".* 
FROM "cars"."review" 
WHERE 
EXISTS (SELECT * FROM cars.cars_tags 
     WHERE cars.cars_tags.car_id = cars.review.cars_id 
     AND cars.cars_tags.tag_id = '91782e95-8c5d-4254-82ab-b11a21306c18') 
AND 
EXISTS (SELECT * FROM cars.cars_tags 
     WHERE cars.cars_tags.car_id = cars.review.cars_id 
     AND cars.cars_tags.tag_id = '9031cec30-df27-471e-858d-53c3d9657c8a') 
ORDER BY "cars"."review"."score" DESC LIMIT 100 

該查詢只是簡單地找到所有評論,其中有兩個tag_id的cars_tags條目存在。