簡體   English   中英

如何在Nodejs中使用Sequelize在沒有公共列的兩個表上進行INNER JOIN?

[英]How to do INNER JOIN on two tables without common columns using Sequelize in Nodejs?

我有兩張桌子。

活動

ID 原因 目標類型 目標
1 5 0 5000
2 4 1 34500
3 5 1 50000
4 1 0 9000
5 8 1 35000
6 3 1 60000

Model 定義為:

module.exports = (sequelize, Sequelize) => {
    const Campaigns = sequelize.define('Campaigns', {
        id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
        cause: Sequelize.INTEGER,
        goalType: Sequelize.INTEGER,
        target: Sequelize.FLOAT,
    }, {
        freezeTableName: true,
    });
    return Campaigns
}


Campaign_Tasks

ID uuid 行動 地位 用戶身份
1 001-0000004 2 0 50
2 001-0000004 1 4 60
3 001-0000003 2 7 50
4 001-0000007 0 10 40
5 001-0000010 1 3 30
6 001-0000003 0 5 50

Model 定義為:

module.exports = (sequelize, Sequelize) => {
    const Campaign_Tasks = sequelize.define('Campaign_Tasks', {
        id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
        userId: Sequelize.INTEGER,
        uuid: Sequelize.STRING,
        action: Sequelize.INTEGER,
        status: Sequelize.INTEGER,
    }, {
        freezeTableName: true,
    });
    return Campaign_Tasks
}

tasks 表中的每個 UUID 對應於campaign 表中的 id(每個 UUID 都是由 id 間接生成的,這個過程是可逆的)。 但可以看出,兩個表中都沒有公共列。 我需要根據活動表中的 id 和活動表中的 uuid 找到這兩個表的內連接(其中 uuid 不是活動表的 PK)

通過遵循本教程: https://lorenstewart.me/2016/09/12/sequelize-table-associations-joins/我創建了一個數據庫 object。 這是必要的,因為我無法在 model 文件中定義關聯,因為我不斷收到此處提到的錯誤: hasMany 調用的東西不是 Sequelize.Model 的實例

const db = require('./models/index')

const db_ = {};

db_.Sequelize = db.Sequelize;
db_.sequelize = db.sequelize;

//Models/tables
db_.campaigns = require('./models/campaigns')(db.sequelize, db.Sequelize);
db_.campaign_Tasks = require('./models/campaignTasks')(db.sequelize, db.Sequelize);

//Relations
db_.campaign_Tasks.belongsTo(db_.campaigns);
db_.campaigns.hasMany(db_.campaign_Tasks);

module.exports = db_;

我怎樣才能對這兩個表進行內部聯接。 我正在尋找這樣的東西:

const uuidToId = require('../../helpers/uuidToId')

let rows = await db_.campaign_Tasks.findAll({
        include: [{
            model: db_.campaigns,
            required: true,
            where: {
                id: uuidToId.uuidToId(/*<-uuid from campaign_Tasks rows->*/)
            }
        }]
    })

uuidToId 將 UUID 轉換回 id。 提前致謝。

我想到了三個解決方案:

  1. 運行兩個單獨的查詢,首先獲取所有活動 ID,生成適當的 uuid,在第二個查詢中使用它,然后將結果合並到代碼中(我的首選方式);
  2. 在您的數據庫中創建一個視圖,該視圖將包含已處理的結果和 select 針對該視圖(請注意,如果您使用計算列,您將無法索引它們,因為 MySQL 目前不支持該功能);
  3. 使用稱為交叉連接的東西。 它本身不是連接,但它會計算兩個表的笛卡爾積。 https://www.mysqltutorial.org/mysql-cross-join/

我從來沒有使用過交叉連接,因為我試圖讓我的查詢盡可能簡單,因為它允許我緩存中間結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM