我有以下表格。
id
caption
1
BMW
2
Nissan
3
Toyota
id
caption
1
Red
2
Black
3
White
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
但我需要为每一行获取完整的标记字幕字符串,而不仅仅是第一行,因为我的查询似乎会返回。
答案 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_aggSELECT 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];