如何进行正确的查询

时间:2015-02-15 09:45:59

标签: sql postgresql

我有以下表格。

表“个人资料”

id caption
1 BMW
2 Nissan
3 Toyota

表“tags”

id caption
1 Red
2 Black
3 White

表“tag_links”

id profile_id tag_id
1 1 1 宝马红色 2 1 3 BMW in White
3 2 1 红色日产 4 3 2 丰田黑色

我尝试从配置文件表中选择项目并包含一些标签。 此查询例如:

SELECT p.id, p.caption, array_to_string(array_agg(tg.caption), ',') AS tags 
FROM profiles p 
LEFT JOIN tag_links l ON l.profile_id = p.id 
LEFT JOIN tags tg ON tg.id = l.tag_id
WHERE tg.id = 1 
GROUP BY p.id

结果

id caption tags
1 BMW Red 只返回一个标记,而不是全部 2 Nissan Red

但我需要为每一行获取完整的标记字幕字符串,而不仅仅是第一行,因为我的查询似乎会返回。

1 个答案:

答案 0 :(得分:1)

整个组需要一个WHERE clausule,这意味着你必须使用HAVING:

SELECT p.id, p.caption, array_to_string(array_agg(tg.caption), ',') AS tags 
FROM profiles p 
 JOIN tag_links l ON l.profile_id = p.id 
 JOIN tags tg ON tg.id = l.tag_id
GROUP BY p.id
HAVING array_agg(tg.id) @> ARRAY[1];

当您需要INNER JOIN时,请不要使用LEFT JOIN。

您也可以使用string_agg:

而不是array_to_string + array_agg
SELECT p.id, p.caption, string_agg(tg.caption, ',') AS tags 
FROM profiles p 
 JOIN tag_links l ON l.profile_id = p.id 
 JOIN tags tg ON tg.id = l.tag_id
GROUP BY p.id
HAVING array_agg(tg.id) @> ARRAY[1];