首页 > 解决方案 > 续集查询以根据列值获取不同行的不同列

问题描述

我有以下架构

module.exports = (sequelize, DataTypes) => {
  const Photo = sequelize.define(
    "Photo",
    {
      photoURL: {
        type: DataTypes.STRING,
        allowNull: false
      },
      blurPhotoURL: {
        type: DataTypes.STRING,
        allowNull: false
      },
      userId: { //userId of user who has uploaded the photo
        type: DataTypes.UUID,
        allowNull: false
      },
      isPublic: {
        type: DataTypes.BOOLEAN,
        default: false
      }
    }
    {}
  );
}

我还有一个架构SubscriberInfo

module.exports = (sequelize, DataTypes) => {
  const SubscriberInfo = sequelize.define(
    "SubscriberInfo",
    {
      userId: { // subscriber userId
        type: DataTypes.UUID,
        allowNull: false
      },
      modelId: { //subscribed userId
        type: DataTypes.UUID,
        allowNull: false
      }
    },
    {}
  );
}

因此,就像 Instagram 个人资料一样,用户可以隐藏照片,只有他的追随者才能看到照片,而用户的重置将看到同一张照片的模糊版本。

我已经设法将模糊照片和原始照片保存在我的数据库中,并且isPublic是用于判断照片是否为私人照片的列。

在我的 UI(个人资料部分)上,我想根据查看个人资料的用户显示照片和模糊照片。

我可以在一个查询中实现这一点,在我返回的 JSON 中,我得到blurPhotoURLphotoURL取决于用户是谁以及照片是否是isPublic

谢谢你的建议!

标签: node.jsplsqlsequelize.js

解决方案


你可能想要这样的东西:

select 
  case when CUR_VIEWER_USER in  -- check if current user is SubscriberInfo 
(select modelId SubscriberInfo SI 
    where p.userId = si.userId) 
  then photoURL 
  else  blurPhotoURL as photo_for_user 
from Photo P
 where isPublic = true 
 or (isPublic = false and userId  = CUR_VIEWER_USER) -- if curUser is owner show his unpublished photos

从该查询中,您可以获得基本的想法,如何将其更改为适合您的情况。我不确定如何将 current_user 插入到查询中,但您仍然有起点。


推荐阅读