Postgres Select Distinct AND Order By Date



表格及备注栏:

,标记,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表中的任何字段,因此我能够完全删除该连接。

最新更新