2017-09-04 93 views
0

比方說,我有一個MySQL表是這樣的:如何使用node.js中的sequelize編寫mysql連接查詢?

enter image description here

我如何編寫使用sequelize以下MySQL查詢?

select mt.JobId 
from MyTable as mt join MyTable as mt2 on mt2.JobId = mt.JobId 
where mt.TaskSeq = 0 and mt.TaskState = 'Done' and mt2.TaskSeq = 1 
and mt2.TaskState = 'New' 

該查詢返回所有JobId(胡)的taskADone狀態和taskBNew狀態。

在這種情況下,它返回qwertzxcv

在閱讀了類似的stackoverflow問題here。我有點困惑,因爲我只有一張桌子。我應該使用hasManybelongsTo爲了創建一個join查詢的續集?

以下是我的node.js腳本的一部分,用於創建該表

var MyTable = conn.define(
'MyTable', 
{ 
    JobId: { 
    type: Sequelize.STRING, 
    unique: true 
    }, 
    TaskName: { 
    type: Sequelize.STRING 
    }, 
    TaskSeq: { 
    type: Sequelize.INTEGER 
    }, 
    TaskState: { 
    type: Sequelize.STRING 
    } 
}, 
{ 
    collate: 'utf8mb4_bin' 
} 
) 

MyTable.sync() 
module.exports = { 
    MyTable, conn 
} 

,這是我sequelize查詢,它未能歸還JobId的I需要。

MyTable.belongsTo(MyTable, {foreignKey: 'id'}) 
MyTable.findAll({ 
attributes: ['JobId'], 
where: { 
    TaskSeq: 0, 
    TaskState: 'DONE' 
}, 
include: [{ 
    model: MyTable, 
    attributes: ['JobId'], 
    where: { 
     JobId: sequelize.col('MyTable.JobId'), 
     TaskSeq: 1, 
     TaskState: 'NEW' 
    } 
}] 
}).then(result => { 
    console.log(result) 
}) 

回答

0

是的,您需要定義關聯,以便查詢中的包含函數有效。 http://docs.sequelizejs.com/manual/tutorial/associations.html

MyTable.belongsTo(MyTable,{foreignKey:'id'})是不是使用正確的ID是嗎?如果你想加入JobId然後使用它。我甚至沒有看到上面表格中的id列。

或嘗試一個原始查詢:

`sequelize.query('select mt.JobId from MyTable as mt join MyTable as mt2 on 
    mt2.JobId = mt.JobId where mt.TaskSeq = 0 and mt.TaskState = 'Done' and 
    mt2.TaskSeq = 1', { type: sequelize.QueryTypes.SELECT } 
).then(myTables => { 
    console.log(myTables) 
})` 
+0

的'id'列由sequelize自動生成。 – Brian

+0

我在本地運行了相同的代碼,我不認爲Sequelize支持表關聯返回到同一個表。 我不知道的ID PK列,但我的意思是試圖改變: 'MyTable.belongsTo(MyTable的,{FOREIGNKEY: '身份證'})'來: 'MyTable.belongsTo(MyTable的,{FOREIGNKEY :'JobId'})' 但是,我安裝的版本,也沒有工作。 我只是使用原始查詢,並得到你想要的確切結果。 http://docs.sequelizejs.com/manual/tutorial/raw-queries.html –