2017-10-13 104 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条目存在。