连接两个没有关联的表

我试图通过连接两个不使用关系“关联”的表来检索数据。 这两个表如下:

mysql> desc partner_txns; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | txn_id | int(11) | NO | | NULL | | | user_id | int(11) | NO | MUL | NULL | | | txn_type | varchar(1) | YES | | NULL | | | txn_amnt | double | YES | | NULL | | | desc | varchar(64) | YES | | NULL | | | createdBy | int(11) | NO | MUL | NULL | | | created_on | datetime | NO | | NULL | | +------------+-------------+------+-----+---------+----------------+ 8 rows in set (0.00 sec) mysql> desc accounts_master; +-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(64) | NO | | NULL | | | owner | int(11) | NO | MUL | NULL | | | type | int(11) | YES | | 0 | | | expires_on | datetime | NO | | NULL | | | max_lists | int(11) | YES | | 10 | | | max_groups | int(11) | YES | | 10 | | | createdBy | int(11) | NO | MUL | NULL | | | modifiedBy | int(11) | NO | MUL | NULL | | | created_on | datetime | NO | | NULL | | | modified_on | datetime | NO | | NULL | | +-------------+-------------+------+-----+---------+----------------+ 11 rows in set (0.00 sec) 

没有使用sequelize,通常我会做这样的SQL查询:

 mysql> select a.user_id, b.name from partner_txns a, accounts_master b where a.createdBy = 3 and a.user_id = b.owner; +---------+-------------+ | user_id | name | +---------+-------------+ | 8 | New account | | 8 | Comviva | | 8 | Infosys | | 9 | HDFC | | 9 | INTEGRA | +---------+-------------+ 5 rows in set (0.00 sec) 

假设我将这两个表格作为两个模型,如下所示,使用Sequelize做什么等同于:

  • PartnerTxn
  • 帐户

我很想用像:

 var Model = require('ecp_model'); Model.PartnerTxn.findAll({ where: {createdBy:3 }, include : [{model:Model.Account, attribute:['name']}] }).then(function(results) { console.log("results:", results); }); [rv.nath@localhost authserver]$ 

但是这样做是行不通的,因为这两个表是不相关的。 所以,我得到一个错误,如下所示:

 Unhandled rejection Error: Account is not associated to PartnerTxn! at validateIncludedElement (/var/opt/ecp_db/node_modules/sequelize/lib/model.js:569:11) at /var/opt/ecp_db/node_modules/sequelize/lib/model.js:452:29 at Array.map (native) at validateIncludedElements (/var/opt/ecp_db/node_modules/sequelize/lib/model.js:448:37) at null.<anonymous> (/var/opt/ecp_db/node_modules/sequelize/lib/model.js:1360:32) at tryCatcher (/var/opt/ecp_db/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/var/opt/ecp_db/node_modules/bluebird/js/release/promise.js:503:31) at Promise._settlePromise (/var/opt/ecp_db/node_modules/bluebird/js/release/promise.js:560:18) at Promise._settlePromise0 (/var/opt/ecp_db/node_modules/bluebird/js/release/promise.js:605:10) at Promise._settlePromises (/var/opt/ecp_db/node_modules/bluebird/js/release/promise.js:684:18) at Async._drainQueue (/var/opt/ecp_db/node_modules/bluebird/js/release/async.js:126:16) at Async._drainQueues (/var/opt/ecp_db/node_modules/bluebird/js/release/async.js:136:10) at Immediate.Async.drainQueues [as _onImmediate] (/var/opt/ecp_db/node_modules/bluebird/js/release/async.js:16:14) at processImmediate [as _immediateCallback] (timers.js:383:17) 

我知道这几乎是一年后,但如果有人在你的情况,并寻找正确的答案。

当你有两个单独的数据types通过第三个表链接,你正在寻找Sequelize的BelongToMany(通过)。

所以在你的情况下,你需要定义第三个Model:UserMaster。 您将为UserMaster提供两个属性:user_id(与PartnerTxn属性相同)和owner(与Account属性相同)。

那么你会这样做:

 Account.belongsToMany(PartnerTxn, {through: 'UserMaster'}); PartnerTxn.belongsToMany(Account, {through: 'UserMaster'}); 

为了进一步的参考, 文件有信息。