我正在尝试2个小时来解决一个不是一个问题。 我正在使用生成的yeoman Angular-fullstack App。
我想用sequelize编写这段代码:
SELECT *
FROM demand
WHERE city_id NOT IN (
SELECT city_id
FROM demand
WHERE user_id=req.params.user_id)
我还有以下代码,但这不起作用。我只得到[]
export function getCity(req, res) {
return Demand.findAll({
where: {
city_id:{ $notIn: Demand.findAll({
attributes: ['city_id'],
where: {
user_id: req.params.user_id,
}
})}
}
})
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
}
你有线索吗? 谢谢。
答案 0 :(得分:3)
第一个查询的问题就在那里,因为sequelize的findall方法返回一个promise。
在sequelize条件中使用子查询的唯一方法是通过文字方法:sequelize.literal('your query');
检查此问题以获取更多信息https://github.com/sequelize/sequelize/issues/3961
答案 1 :(得分:2)
我还没有找到一个很好的解决方案:我终于用查询写了。
export function showDemandArtistNoUser(req, res) {
return db.sequelize.query('SELECT * FROM demands WHERE city_id NOT IN (SELECT city_id FROM demands WHERE user_id='+req.params.user_id+')', { type: db.sequelize.QueryTypes.SELECT })
.then(handleEntityNotFound(res))
.then(respondWithResult(res))
.catch(handleError(res));
}
使用我的angular-fullstack,我必须在我的页面上添加:
import db from '../../sqldb';
答案 2 :(得分:1)
我在项目中遇到过类似的问题。 我选择实现它的方式有点不同有两个原因:
这是我的代码段,希望它有所帮助。
const tempSQL = sequelize.dialect.QueryGenerator.selectQuery('MyOtherTable',{
attributes: ['fkey'],
where: {
field1: 1,
field2: 2,
field3: 3
}})
.slice(0,-1); // to remove the ';' from the end of the SQL
MyTable.find( {
where: {
id: {
$notIn: sequelize.literal('(' + tempSQL + ')'),
}
}
} );
有些人可能会选择不使用tempSQL变量,只是在find结构中构建SQL(可能使用帮助器方法?)
我也认为这可能是sequelize的子查询扩展的基础,因为它几乎使用相同的语法。