首页 > 解决方案 > 我想为从 mysql 数据库登录的每个用户发送唯一记录

问题描述

我想发送每个登录唯一记录列表的用户,即来自数据库的不同记录,对于我想跳过已经发送给其他签名用户的记录的每个用户。我是初学者,如何我可以实施吗?这是从数据库中获取记录的代码

phrases.findAll({
      where: {
         userId: user.id,
         phraseStatus: 1
      },
      limit: 10,
      offset,
      10
   })
   .then((data) => {
      userObj.phrases.push(...data);

      return res.status(200).json(userObj);
   });

标签: javascriptmysqlnode.jsexpresssequelize.js

解决方案


您将需要跟踪已发送给其他用户的内容。我建议您保留一张表格,phrases_sent以记录到目前为止已发送的内容。添加phrase_id到这个新表中,以便建立关系。

查看文档中的关联

phrases然后,您可以通过外部连接到您的表来查询该表,phrases_sent以返回迄今为止尚未发送的短语。

就像是:

    const phrases = await sequelize.models.phrase.findAll({
        where: {
            '$phrasesSents.phrase_id$': {[Op.is]: null} // query the joined table
        },
        attributes: ['phrase.phrase'], // the unused phrases
        include: [
            {
                attributes: [],
                model: sequelize.models.phrasesSent,
                required: false, // specify this is a left outer join
            }
        ],
        raw: true,
        nest: true
    });

会产生:

SELECT "phrase"."phrase" 
FROM "phrases" AS "phrase" 
LEFT OUTER JOIN "phrases_sent" AS "phrasesSents" ON "phrase"."id" = "phrasesSents"."phrase_id" 
WHERE "phrasesSents"."phrase_id" IS NULL;

我相信与 NOT IN (SELECT ...) 样式查询相比,执行 LEFT OUTER JOIN 具有性能优势。


推荐阅读