【发布时间】:2020-12-30 04:34:59
【问题描述】:
我有两个表:coupons 表和 coupon_city_map 表。
| id | coupon_code |
|---|---|
| 1 | OFFER20 |
| 2 | OFFER10 |
| 3 | OFFER50 |
| 4 | OFFER40 |
| 5 | OFFER90 |
| coupon_Id | city_id |
|---|---|
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 2 |
我需要 city_id = 2 的 ID 为 1 4, and 5 的优惠券。
所以它应该获取city_id=2 的所有优惠券,即ID为1 and 4的优惠券
它还应该获取在coupon_city_map 中没有密钥的优惠券,即5。
这是我尝试过的,但[Op.or] 中的查询不起作用,而是返回所有优惠券。
let coupons = await Coupon.findAll({
where: {
[Op.or]: [
{ '$CouponCities.city_id$': city_id },
{ '$CouponCities.coupon_id$': null },
],
...filters // other filter like is_active: true
},
include: {
model: CouponCity,
attributes: [],
},
attributes: ['id', 'coupon_code', 'discount_per', 'flat_discount', 'discount_upto', 'description', 'display'],
});
正在生成的查询
SELECT `Coupon`.`id`,
`Coupon`.`coupon_code`,
`Coupon`.`discount_per`,
`Coupon`.`flat_discount`,
`Coupon`.`discount_upto`,
`Coupon`.`description`,
`Coupon`.`display`
FROM `coupons` AS `Coupon`
LEFT OUTER JOIN `coupon_city_map` AS `CouponCities` ON `Coupon`.`id` = `CouponCities`.`coupon_id`
WHERE (`Coupon`.`user_id` IS NULL OR `Coupon`.`user_id` = 1)
AND `Coupon`.`is_active` = true
AND `Coupon`.`is_external` = false
AND `Coupon`.`start_date` < '2020-12-30 10:33:20'
AND `Coupon`.`expiry_date` > '2020-12-30 10:33:20';
更新 我也在下面尝试过,但它仍然退回所有优惠券。
let coupons = await Coupon.findAll({
// where: {
// ...filters,
// },
include: {
model: CouponCity,
required: false,
where: {
[Op.or]: [
{
zone_id: zoneId,
}, {
coupon_id: null,
},
],
},
attributes: [],
},
attributes: ['id', 'coupon_code', 'discount_per', 'flat_discount','discount_upto', 'description', 'display'],
});
...它会生成以下查询。
SELECT `Coupon`.`id`,
`Coupon`.`coupon_code`,
`Coupon`.`discount_per`,
`Coupon`.`flat_discount`,
`Coupon`.`discount_upto`,
`Coupon`.`description`,
`Coupon`.`display`
FROM `coupons` AS `Coupon`
LEFT OUTER JOIN `coupon_city_map` AS `CouponCities`
ON `Coupon`.`id` = `CouponCities`.`coupon_id`
AND ( `CouponCities`.`zone_id` = 1
AND `CouponCities`.`coupon_id` IS NULL )
WHERE `Coupon`.`is_active` = true
AND `Coupon`.`is_external` = false;
【问题讨论】:
标签: mysql node.js sequelize.js