我使用Sequelize.JS连接到MySQL数据库。我有以下表结构:
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' ],
]
});
但是,我不知道如何嵌套MIN
和IF
函数,就像我对原始SQL一样。
答案 0 :(得分: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
电话,但它正在运作,我不知道如何改进它。