2014-12-03 72 views
0

我们遇到了问题。我们无法使用sequelize在以下结构中执行SQL SELECT。续集和2连接表,麻烦

这是我们的结构,见下图。

enter image description here

我们正在努力执行该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 

回答

0

拥有对包括keywords属性,应该是足够了,没有必要将它添加到外部查询

attributes: [models.sequelize.fn('count', models.sequelize.col('sent_deals.user_id'))], 


order: [['alert.keywords', ' DESC']], 
attributes: ['alert.keywords'], <-- This line is superflous 
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'] 
    } 
] 

您是否应该包含SentDeal以查询产品ucts.sent_deal?这个问题可能是更好的问题上的续集GH

+0

因为:...现在我们不能通过警报命令了... 这就是为什么我们添加(当我们使用以前版本的sequelize:1.7。 8)'''attributes:['alert.keywords']''',所以可以在对象的顶层(包含结果)而不在主对象的“alert”对象内显示的警报。所以我们可以根据警报排序所有结果。你明白我的意思吗?但是''''''''''''''''''线路不能工作,因为我们试图升级到2.0.0。而sent_deals现在是一个连接表,我们用它在产品和user_alerts模型中使用“through”连接到它。 – 2014-12-03 12:23:01

+0

小例子,我们想要的东西是:''{{alert:'test2'},{alert:'test1'}}'''而不是''{{alert:{keywords:'test2'}}, {alert:{keywords:'test1'}}}'''在1.7.8这个工作,与“superflous”线,但在2.0.0不再,似乎... – 2014-12-03 12:31:28