我有两个表Coupons
和LocationCoupons
。
Coupons
--------------
id
LocationCoupons
----------------
id
coupon_id
location_id
我想从 Coupons
中选择 LocationCoupons
中不存在的所有记录。
我可以通过编写如下所示的原始查询来获得所需的结果。
const [results, metadata] = await sequelize.query("
SELECT c.id, c.coupon_code FROM coupons c
WHERE NOT EXISTS
(SELECT l.id FROM location_coupon_map l WHERE c.id = l.coupon_id)");
但是当我尝试对关联执行相同操作时,使用联接,传递的 where
子句正在转换 and
。
const coupons = await Coupon.findAll({
include: {
model: LocationCoupon,
where: {
coupon_id: null
},
required: false,
attributes: []
},
attributes: ["id", "coupon_code"]
})
以上关联正在生成以下查询。
SELECT `Coupon`.`id`, `Coupon`.`coupon_code` FROM `coupons` AS `Coupon`
LEFT OUTER JOIN `location_coupon_map` AS `LocationCoupons`
ON `Coupon`.`id` = `LocationCoupons`.`coupon_id`
AND `LocationCoupons`.`coupon_id` IS NULL;
虽然应该如此。
SELECT `Coupon`.`id`, `Coupon`.`coupon_code` FROM `coupons` AS `Coupon`
LEFT OUTER JOIN `location_coupon_map` AS `LocationCoupons`
ON `Coupon`.`id` = `LocationCoupons`.`coupon_id`
WHERE `LocationCoupons`.`coupon_id` IS NULL;
我在这里遗漏了什么吗?
最佳答案
我修好了。 Sequelize 文档不太好。他们应该更好地描述所有可能的关联查询。
const coupons = await Coupon.findAll({
where: {
"$LocationCoupons.coupon_id$": null
},
include: {
model: LocationCoupon,
attributes: []
},
attributes: ["id", "coupon_code"]
})
现在生成的查询和结果符合预期。
SELECT `Coupon`.`id`, `Coupon`.`coupon_code` FROM `coupons` AS `Coupon`
LEFT OUTER JOIN `location_coupon_map` AS `LocationCoupons`
ON `Coupon`.`id` = `LocationCoupons`.`coupon_id`
WHERE `LocationCoupons`.`coupon_id` IS NULL;
关于mysql - 连接两个表时将 where 子句转换为 and 子句的 Sequelize ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539203/