仅在SQL中存在行时返回值

时间:2017-09-21 13:07:29

标签: sql postgresql

我有一个SQL查询,我想检查当前用户是否已经喜欢某个帖子。

我目前通过检查帖子的现有赞以及其中一个是否将当前用户ID作为用户ID来执行此操作。

但是,我在查询中遇到此问题。我正在使用PostgresSQL btw。

当我执行以下操作时:

CASE WHEN likes.user_id = 5 THEN 1 END AS "liked"

我需要在likes.user_id子句中添加GROUP BY,这会导致每个帖子产生多个结果,因为它会按喜欢对它们进行分组。

我也尝试用它周围的计数来做,但是因为我使用Knex并表达,所以int被转换为字符串,这是我不想要的。

我有没有看到或做错了什么?

PostgresSQL中的完整查询是:

select 
    posts.id, 
    posts.created_at, 
    posts.text, 
    posts.title,
    count(DISTINCT likes.id) as "likeCount",
    count(DISTINCT comments.id) as "commentCount",
    count(CASE WHEN likes.user_id = 5 THEN 1 END) AS "liked"
from updates
LEFT JOIN comments ON updates.id = comments.update_id
LEFT JOIN likes ON updates.id = likes.update_id
WHERE posts.user_id = 5
GROUP BY posts.id, likes.user_id
ORDER BY updates.created_at

我现在得到的结果是(简化):

╔════╤═══════════════════════════════╤═══════════════╤════════════╤═══════╗
║ id │ created_at                    │ comment_count │ like_count │ liked ║
╠════╪═══════════════════════════════╪═══════════════╪════════════╪═══════╣
║ 40 │ 2017-09-21 11:53:11.064774+02 │ 1             │ 0          │ 0     ║
╟────┼───────────────────────────────┼───────────────┼────────────┼───────╢
║ 40 │ 2017-09-21 11:53:11.064774+02 │ 1             │ 0          │ 0     ║
╟────┼───────────────────────────────┼───────────────┼────────────┼───────╢
║ 40 │ 2017-09-21 11:53:11.064774+02 │ 1             │ 0          │ 1     ║
╚════╧═══════════════════════════════╧═══════════════╧════════════╧═══════╝

2 个答案:

答案 0 :(得分:1)

使用条件聚合:

MAX(CASE WHEN likes.user_id = 5 THEN 1 ELSE 0 END) AS liked

如果至少有一个来自用户5,则为1,否则为0。

(这应该会产生一个整数。如果您的框架妨碍了,您可以通过MAX(...)::integer AS liked强制执行此操作。)

答案 1 :(得分:0)

如果您有可靠的方式对它们进行排序,您可以使用

CASE WHEN likes.user_id = 5 THEN 1 END AS "liked"
GROUP BY yourcondition
LIMIT 1

这将只返回返回的第一行,因此如果您有办法确保首先返回您想要的记录,它可能适合您。除此之外,如果没有更多信息,很难帮助你。