WHERE子句中的MySQL查询优先级与复杂查询

匿名的

我正在努力实现以下目标。

我必须从数据库中获取所有已付款,仍可以使用(尚未过期)但尚未使用的优惠券代码。

这是我写的查询:

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)

我需要同时获取两种类型,但是由于某些原因,更改优先级会更改结果的数量。这对我来说没有意义,因为我认为它应该是完全相同的结果。

ericpap

只要我不用测试就可以看到,最后一个查询条件是错误的。如果您从左到右计算括号,则表明到达“或”时将没有空括号。因此,对or的评估与firt AND ant IN子句处于同一级别,从而给您带来了意外的结果。上面这个条件看起来不错。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章