只有在SQL中存在行时才返回值
·
问题:只有在SQL中存在行时才返回值
我有一个 sql 查询,我想检查某个帖子是否已经被当前用户喜欢。
我目前通过检查帖子的现有喜欢以及其中一个是否将当前用户 ID 作为用户 ID 来执行此操作。
但是,我无法在查询中执行此操作。我在之间使用 PostgresQL。
当我执行以下操作时:
CASE WHEN likes.user_id = 5 THEN 1 END AS "liked"
我需要在GROUP BY子句中添加likes.user_id,这会导致每个帖子有多个结果,因为它按喜欢对它们进行分组。
我也尝试用一个围绕它的计数来做到这一点,但由于我使用 Knex 和 express,整数被转换为字符串,这是我不想要的。
有什么我没有看到或做错的吗?
PostgresQL 中的完整查询是:
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 ║
╚════╧═══════════════════════════════╧═══════════════╧════════════╧═══════╝
解答
使用条件聚合:
MAX(CASE WHEN likes.user_id = 5 THEN 1 ELSE 0 END) AS liked
如果用户 5 至少有一个喜欢,这给你 1,否则为 0。
(这应该导致一个整数。如果你的框架挡住了,你可以通过MAX(...)::integer AS liked强制它。)
更多推荐
所有评论(0)