postgresql Postgres按日期选择不同和排序

qv7cva1a  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(149)

表和注解栏:

图片标签图片标签

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;

由于一张图片可以有多个标签,这可能会多次返回相同的picture.id。有没有办法防止这种情况,使picture.ids只显示一次?
它现在是这样返回的:

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]
d5vmydt9

d5vmydt91#

正如我在评论中所说的,在像这样组合行之前,您需要仔细考虑。但是如果您真的想这样做,您可以这样做:

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

相关问题