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