gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:34:52 25 4
gpt4 key购买 nike

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

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

这是我写的查询:

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 时,没有空的。因此, or 的评估级别与第一个 AND ant IN 子句相同,会给您带来意想不到的结果。上面这个条件看起来不错。

关于具有复杂查询的 WHERE 子句中的 MySQL 查询优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com