使用CASE在两个表中进行PostgreSQL查询

时间:2018-07-16 02:22:59

标签: sql postgresql

我有两个表publicationspublication_likes,它们之间存在多对多关系,并且这些字段为:user_idpub_idcreated_at。 / p>

用户拥有个人资料,并在该个人资料上拥有出版物。 当需要特定用户的个人资料时,我需要获取其出版物(这很容易)。我还需要知道登录的用户喜欢其中哪些出版物。

示例:user_a是个人资料所有者并拥有出版物,user_b已登录并访问user_a个人资料。服务器加载user_a个发布,并告诉user_b其中user_a个喜欢的发布

在询问之前,我尝试过思考并找到了解决方案,但我不知道它是否正确

 SELECT p.id, 
      p.user_id as creator, 
      p.p_content, 
      CASE WHEN pl.user_id = $1 THEN 1 
           ELSE 0 
       END as liked from publications p
  LEFT JOIN publications_likes pl on p.id = pl.pub_id 
  WHERE p.user_id = $2;

请告诉我您是否认为这是正确的,还有其他方法可以做到这一点。

注意:我知道标题不是很具体,但我想不出其他标题。如果您可以做得更好,请随时进行。

1 个答案:

答案 0 :(得分:2)

编辑:已更新以反映评论中的说明。

您无需使用CASE语句即可获得正确的结果集。

 SELECT p.id, 
       p.user_id as creator, 
       p.p_content, 
       pl.id IS NOT NULL AS liked 
   FROM publications p
   LEFT JOIN publications_likes pl ON p.id = pl.pub_id AND pl.user_id = $1
   WHERE p.user_id = $2;

由于要加入M:N关系的联结表,因此您需要在联接上使用两个条件以确保找到正确的pl行。否则,您实际上并不真正知道要加入哪个pl,并且可能最终得到liked的假阴性。