【发布时间】:2023-04-03 18:15:01
【问题描述】:
我正在尝试使用 engagement_type 列出唯一的 user engagements
我曾经有以下查询。
SELECT u.id, u.fname, u.lname FROM (
SELECT id, engagement_type FROM (
SELECT user_id AS id, 'comment'
FROM comments WHERE commentable_id = 48136 AND commentable_type = 'Video'
UNION ALL
SELECT user_id AS id, 'like'
FROM likes WHERE likeable_id = 48136 AND likeable_type = 'Video'
) AS a
GROUP BY id
LIMIT 10
) b JOIN users u USING (id);
返回:
id | fname | lname
------------------------------
1 | joe | abc
2 | sarah | qer
3 | megan | tryey
4 | john | vdfa
这很好。现在,我想包括参与类型。我想出了这个:
SELECT u.id, u.fname, u.lname, engagement_type FROM (
SELECT id, engagement_type FROM (
SELECT user_id AS id, 'comment' AS engagement_type
FROM comments WHERE commentable_id = 48136 AND commentable_type = 'Video'
UNION ALL
SELECT user_id AS id, 'like' AS engagement_type FROM likes
WHERE likeable_id = 48136 AND likeable_type = 'Video'
) AS a
GROUP BY id, engagement_type
LIMIT 10
) b JOIN users u USING (id);
现在返回:
id | fname | lname | engagement_type
---------------------------------------------------
1 | joe | abc | comment
2 | sarah | qer | like
3 | megan | tryey | like
4 | john | vdfa | like
1 | joe | abc | like
3 | megan | tryey | comment
上面的唯一问题。结果不再是唯一的。如您所见,Joe 和 Megan 有 2 个条目。
知道如何让它工作吗?
【问题讨论】:
-
尝试从
GROUP BY子句中删除engagement_type并检查是否满足您的需求。 -
然而,
joe有两个独特的约定,即comment和like。megan也是如此。 -
取决于你想做什么。你想只显示一个engagement_type 还是像“comment, like”这样的列表?
-
您的 b 子查询被分组为
BY id, engagement_type,这就是为什么每个用户可以获得不止一行的原因。您可以将 LIMIT 更改为 1 以将其更改为仅一行,但您真正想要哪一行(正如 Jakub 所说)? -
如果有多个
engagement_type,您未能定义要显示的内容。
标签: sql postgresql subquery