我正在努力实现以下目标。
我必须从数据库中获取所有已付款,仍可以使用(尚未过期)但尚未使用的优惠券代码。
这是我写的查询:
SELECT o.offer_id Offerta
, c.payment_id Transazione
, c.coupon Coupon
, c.status Stato
, p.total_paid Netto
, p.total_paid_nocred Lordo
FROM `coupons` c
LEFT JOIN offers o ON c.offer_id=o.offer_id
LEFT JOIN payments p ON c.payment_id=p.payment_id
LEFT JOIN offers_categories cat ON o.offer_id=cat.offer_id
WHERE c.status = 1
AND usage_date = 0
AND p.status IN (0,1)
AND cat.category_id IN(4,16,134,13,17,61,62,63,64,14,15,31,124,125,126)
AND ((o.coupon_validto > UNIX_TIMESTAMP(NOW())
AND o.instant_coupon != 1) OR (o.instant_ends_30days > DATEDIFF(NOW(), FROM_UNIXTIME(p.time)) AND instant_coupon = 1))
我的最大疑问是关于最后几行:
AND ((o.coupon_validto > UNIX_TIMESTAMP(NOW())
AND o.instant_coupon != 1) OR (o.instant_ends_30days > DATEDIFF(NOW(), FROM_UNIXTIME(p.time)) AND instant_coupon = 1))
实际上,我的数据库中有两种可能的交易。N
从用户购买优惠券到现在,只有一种类型的特定日期的费用,而另一种类型的费用仅在一天之后。
现在,如果我这样做,我将获得2900个结果:
AND ((o.coupon_validto > UNIX_TIMESTAMP(NOW())
AND o.instant_coupon != 1) OR (o.instant_ends_30days > DATEDIFF(NOW(), FROM_UNIXTIME(p.time)) AND instant_coupon = 1))
如果我这样做,我将得到6000个结果(请注意,下面的括号少了一个):
AND (o.coupon_validto > UNIX_TIMESTAMP(NOW())
AND o.instant_coupon != 1) OR (o.instant_ends_30days > DATEDIFF(NOW(), FROM_UNIXTIME(p.time)) AND instant_coupon = 1)
我需要同时获取两种类型,但是由于某些原因,更改优先级会更改结果的数量。这对我来说没有意义,因为我认为它应该是完全相同的结果。
只要我不用测试就可以看到,最后一个查询条件是错误的。如果您从左到右计算括号,则表明到达“或”时将没有空括号。因此,对or的评估与firt AND ant IN子句处于同一级别,从而给您带来了意外的结果。上面这个条件看起来不错。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句