0
我们遇到了问题。我们无法使用sequelize在以下结构中执行SQL SELECT。续集和2连接表,麻烦
这是我们的结构,见下图。
我们正在努力执行该sequelize查询:
query = {
'attributes': [models.sequelize.fn('count', models.sequelize.col('sent_deals.user_id'))],
order: [['alert.keywords', ' DESC']],
attributes: ['alert.keywords'],
include: [
{
model: models.alert,
attributes: ['keywords']
}, {
where: {
'products.sent_deal.created_at': {
between: [moment(start).startOf('day').format('YYYY-MM-DD HH:mm'), moment(end).endOf('day').format('YYYY-MM-DD HH:mm')]
}
},
model: models.product,
attributes: ['id']
}
]
};
models.userAlerts.findAll(query)
但后来我们收到以下错误:"error: missing FROM-clause entry for table "alert""
,因为我们试图选择还外include[]
属性alert.keywords
,但是它仍然在Sequelize JS的早期版本中工作!现在我们不能再通过警报来命令了...... :(它总是返回一个警报,因为“属于”连接,所以理论上它必须工作。
我的猜测是因为查询没有执行直接加入,但在一个子查询做了SELECT FROM
,见下图:
SELECT "userAlerts".*
,"alert"."id" AS "alert.id"
,"alert"."keywords" AS "alert.keywords"
,"products"."id" AS "products.id"
,"products.sent_deal"."user_alert_id" AS "products.sent_deal.user_alert_id"
,"products.sent_deal"."deal_id" AS "products.sent_deal.deal_id"
,"products.sent_deal"."created_at" AS "products.sent_deal.created_at"
FROM (
SELECT "userAlerts"."id"
,"userAlerts"."user_id"
,"userAlerts"."alert_id"
,"userAlerts"."activationToken"
,"userAlerts"."activatedAt"
,"userAlerts"."createdAt"
,"userAlerts"."updatedAt"
FROM "user_alerts" AS "userAlerts"
WHERE (
SELECT "products.sent_deal"."user_alert_id"
FROM "sent_deals" AS "products.sent_deal"
INNER JOIN "deals" AS "products" ON "products"."id" = "products.sent_deal"."deal_id"
WHERE "userAlerts"."id" = "products.sent_deal"."user_alert_id"
AND (
"products.sent_deal"."created_at" BETWEEN '2014-11-17 00:00'
AND '2014-12-02 23:59'
) LIMIT 1
) IS NOT NULL
ORDER BY "alert"."keywords" DESC LIMIT 1
) AS "userAlerts"
LEFT JOIN "alerts" AS "alert" ON "alert"."id" = "userAlerts"."alert_id"
INNER JOIN (
"sent_deals" AS "products.sent_deal" INNER JOIN "deals" AS "products" ON "products"."id" = "products.sent_deal"."deal_id"
) ON "userAlerts"."id" = "products.sent_deal"."user_alert_id"
AND (
"products.sent_deal"."created_at" BETWEEN '2014-11-17 00:00'
AND '2014-12-02 23:59'
)
ORDER BY "alert"."keywords" DESC
因为:...现在我们不能通过警报命令了... 这就是为什么我们添加(当我们使用以前版本的sequelize:1.7。 8)'''attributes:['alert.keywords']''',所以可以在对象的顶层(包含结果)而不在主对象的“alert”对象内显示的警报。所以我们可以根据警报排序所有结果。你明白我的意思吗?但是''''''''''''''''''线路不能工作,因为我们试图升级到2.0.0。而sent_deals现在是一个连接表,我们用它在产品和user_alerts模型中使用“through”连接到它。 – 2014-12-03 12:23:01
小例子,我们想要的东西是:''{{alert:'test2'},{alert:'test1'}}'''而不是''{{alert:{keywords:'test2'}}, {alert:{keywords:'test1'}}}'''在1.7.8这个工作,与“superflous”线,但在2.0.0不再,似乎... – 2014-12-03 12:31:28