2016-01-22 130 views
1

我正在使用Sequelize.JS連接到MySQL數據庫。我有以下表結構:如何在sequelize.js中嵌套SQL函數?

products 
--------------------- 
id INT 
name VARCHAR 
price DECIMAL 
price_special DECIMAL 

我想獲得最低price(或special_price,可用時)和最高price(或special_price時可用)。與原始的SQL,我可以做到以下幾點:

SELECT 
    MIN(IF(`price_special` > 0, `price_special`, `price`)) AS `min`, 
    MAX(IF(`price_special` > 0, `price_special`, `price`)) as `max` 
FROM 
    `products` 
; 

我也知道我可以選擇在Sequelize SQL函數包裹欄,這樣一來:

product.findOne({ 
    attributes: [ 
     [ Sequelize.fn('MIN', Sequelize.col('price')), 'min' ], 
     [ Sequelize.fn('MAX', Sequelize.col('price')), 'max' ], 
    ] 
}); 

不過,我不知道如何嵌套MINIF函數,我用原始SQL做的方式。

回答

1

在發佈我的問題後,我發現一個issue in GitHub與類似的問題。

我得到的解決方案是:

product.findOne({ 
    attributes: [ 
     [ Sequelize.fn('MIN', Sequelize.fn('IF', 
       Sequelize.literal('`price_special` > 0'), 
       Sequelize.col('price_special'), 
       Sequelize.col('price'))), 'min' ], 
     [ Sequelize.fn('MAX', Sequelize.fn('IF', 
       Sequelize.literal('`price_special` > 0'), 
       Sequelize.col('price_special'), 
       Sequelize.col('price'))), 'max' ], 
    ] 
}); 

我個人不喜歡Sequelize.literal電話,但它的工作,我不知道如何改進它。