表格及备注栏:
,标记,picture_tags
pictures.id
pictures.created_date
tags.id
picture_tags.tag_id
picture_tags.picture_id
我使用连接表进行以下查询:
SELECT pictures.*, pictures.id as picture_id, tags.id as tag_id
FROM picture_tags
LEFT JOIN pictures ON pictures.id = picture_tags.picture_id
LEFT JOIN tags ON tags.id = picture_tags.tag_id
WHERE picture_tags.tag_id IN (1, 2)
GROUP BY pictures.id, tags.id
ORDER BY pictures.created_date ASC;
由于一张图片可以有多个标签,这可以返回相同的图片。Id多次。有没有办法防止这种情况发生,让那张照片。身份证只出现一次?
当前返回如下:
id | created_date | picture_id | tag_id
1 | 2022-12-08 19:04:23 | 1 | 1
1 | 2022-12-08 19:04:23 | 1 | 2
2 | 2022-12-09 00:46:30 | 2 | 3
我理想的回复是这样的:
picture.created_date | picture.id | tagIds
2022-12-08 19:04:23 | 1 | [ 1, 2 ]
2022-12-09 00:46:30 | 2 | [3]
正如我在评论中所说,在像这样组合行之前,您需要仔细考虑。但是如果你真的想这样做,你可以这样做:
SELECT p.id, p.created_date, string_agg(pt.tag_id, ',') as tag_ids
FROM pictures p
INNER JOIN picture_tags pt on pt.picture_id = p.id
WHERE pg.tag_id IN (1,2)
GROUP BY p.id, p.created_date
ORDER BY p.created_date
注:我将LEFT JOIN
转换为INNER JOIN
。在最初的查询中,第一个连接作为LEFT join没有任何意义(所有字段都为NULL),而第二个连接由于有WHERE子句而实际上是INNER join。此外,由于我们实际上没有使用tag
表中的任何字段,因此我能够完全删除该连接。