Mysql 预期结果如何?此外,uid似乎不是唯一的(您应该删除“(bonus_records.uid-unique id)”中的“unique id”,它具有误导性和/或与您想说的意思不同),因此,select中的br1.name、的值没有定义。它们将从您组中的随机
Mysql 预期结果如何?此外,uid似乎不是唯一的(您应该删除“(bonus_records.uid-unique id)”中的“unique id”,它具有误导性和/或与您想说的意思不同),因此,select中的br1.name、的值没有定义。它们将从您组中的随机,mysql,select,Mysql,Select,预期结果如何?此外,uid似乎不是唯一的(您应该删除“(bonus_records.uid-unique id)”中的“unique id”,它具有误导性和/或与您想说的意思不同),因此,select中的br1.name、的值没有定义。它们将从您组中的随机行中选择(或在MySQL 5.7+中失败),而不会(必然)从带有max(id)的行中选择-这可能是您的问题吗?是的,我得到了意外的结果。我将尝试解释。每个玩家都有可能兑换不同类型的奖金。奖金由奖金记录.uid区分。每个奖金(bonus_reco
预期结果如何?此外,
uid
似乎不是唯一的(您应该删除“(bonus_records.uid-unique id)”中的“unique id”,它具有误导性和/或与您想说的意思不同),因此,select
中的br1.name、
的值没有定义。它们将从您组中的随机行中选择(或在MySQL 5.7+中失败),而不会(必然)从带有max(id)
的行中选择-这可能是您的问题吗?是的,我得到了意外的结果。我将尝试解释。每个玩家都有可能兑换不同类型的奖金。奖金由奖金记录.uid区分。每个奖金(bonus_records.uid)依次可以有不同的版本(例如,在某一时刻freespins=10,而在另一时刻freespins=20),因此当您想向玩家显示奖金列表时,您必须始终搜索上次更新(max(bonus_records.id))。感谢您的编辑,这澄清了问题。你能用一个不起作用的测试用例更新你的dbfiddle吗(因为目前它与你的示例不匹配,所以我无法测试它-例如,用户1赎回了不存在的bonusid 1和2)。至少欢迎奖金应该像预期的那样起作用,因为它是直接的,所以我可能误解了什么。关于(completed=0或canceled=0)
,我提到我从您的原始查询(completed=0和canceled=0)
中获取了该条件,因此如果它不同,您可能需要相应地调整它(请随意编辑答案),如果您更新测试用例,我可以测试它。我的第一个选择,从列名判断,was(rb.completed=1和rb.cancelled=0)
(可能会添加检查null
?),它似乎适合您的数据;这能给你预期的结果吗?该术语的目标是,如果该行应计为赎回奖金(从而将计数增加1),则应为“真”,您需要找到正确的组合来描述您希望该行何时计数(例如,“完成时仅计数,但未取消”,即(rb.completed=1和rb.cancelled=0)
)。“如果完成和取消等于0,则表示奖金处于活动状态”转换为不(rb.completed=0和rb.canceled=0)
,这相当于(rb.completed=1或rb.canceled=1)
[组合数量有限。当您告诉我4种组合(0,0)、(0,1)、(1,0)和(1,1)时结果是什么(活动或不活动),我可以告诉你公式-这可能比重试或重新解释要快。它实际上只是取决于你想如何定义它。还有一列“已执行”-如果相关,请不要忘记:-)]你是对的!更改为和否后(rb.completed=0和rb.canceled=0)我已经做了几次测试,现在它似乎工作得很好。我已经尝试了4天来解决这个问题,你帮了我很多!我希望我没有给你带来太多麻烦。非常感谢!actual_count
是该uid的兑换奖金数(只是一个帮助栏)null
表示0,如果您更喜欢0,请尝试coalesce(rd.actual_count,0)
,但这是另一个问题的边界(与您原来的问题不太相关)。显示执行的没有任何意义(请参阅我回答中的第一点):如果玩家的uid已兑换两次-应显示执行的2个潜在值中的哪一个?如果您需要其他条件/数据/结果,可能是时候问一个新问题(包括当前和预期结果);您可以链接到此问题作为背景。
SELECT MAX(br1.id) /* Get last update of bonus */,
br1.uid,
br1.name,
rb1.instance_id,
rb1.player_id,
br1.redeem_count,
rb1.executed,
rb1.completed,
rb1.canceled
FROM
bonus_records br1
LEFT JOIN
redeemed_bonuses rb1 ON
rb1.bonus_id = br1.id
WHERE
(rb1.player_id IS NULL) OR /* never redeemed */
(rb1.player_id = 1 AND /* if redeemed then */
(
br1.redeem_count > ( /* total count of X redemed bonus is less then redeem_count but redeem_count <> 0 */
SELECT COUNT(*)
FROM redeemed_bonuses rb2
INNER JOIN bonus_records br2 ON rb2.bonus_id = br2.id
WHERE br2.uid = br1.uid AND rb2.completed = 0 AND rb2.canceled = 0
) OR
br1.redeem_count = 0 /* redeem_count = 0 means that there is no established limit of redeem */
)
)
GROUP BY
br1.uid
select * from bonus_records br
where not exists
(select 1 from bonus_records br1
where br1.uid = br.uid and br1.id > br.id);
select br.uid, count(*)
from redeemed_bonuses rb
join bonus_records br on br.id = rb.bonus_id
where rb.player_id = 1
and not (rb.completed = 0 and rb.canceled = 0)
group by br.uid;
select pb.*, rd.actual_count from
(select * from bonus_records br
where not exists
(select 1 from bonus_records br1
where br1.uid = br.uid and br1.id > br.id)
) pb -- active potential bonuses
left join
(select br.uid, count(*) as actual_count
from redeemed_bonuses rb
join bonus_records br on br.id = rb.bonus_id
where rb.player_id = 1
and not (rb.completed = 0 and rb.canceled = 0)
group by br.uid
) rd -- redeemed bonuses by that user
on pb.uid = rd.uid
where rd.actual_count is null -- uid never redeemed (left join empty)
or rd.actual_count < pb.redeem_count -- still some remaining
or pb.redeem_count = 0 -- unlimited bonus