代码之家  ›  专栏  ›  技术社区  ›  Slavez

按条件分组给我一些实际结果

  •  0
  • Slavez  · 技术社区  · 6 年前

    我有三个表来维护MySQL中的投注系统。我们的用户说,有些betslips虽然赢了,但并没有改变“赢得状态”。所以我在寻找这些错误的结果。很快,我需要来自betslips表的id,该表具有来自betslips_内表的匹配选项(所有选项都应该是匹配的)和来自bets表的匹配结果。

    SELECT a.ID,a.betslip,a.bet,a.choice,c.result
    FROM betslips_inner a JOIN
         betslips b JOIN
         bets c
         ON b.won=0 AND a.betslip=b.ID AND c.ID=a.bet AND a.choice=c.result
    GROUP BY a.betslip
    having count(*) = (SELECT COUNT(*) FROM betslips_inner WHERE betslip = a.betslip)
    

    这个查询得到一些结果然而,它似乎只给了我一小部分真正的结果,我需要。

    我错过了什么为什么这个查询会导致我得到真实的结果,而不是所有真实的结果?

    示例数据

    BET
    -------
    ID result
    1  1
    2  2
    3  1
    4  1
    -------
    
    BETSLIPS
    -------
    ID won
    1  0
    2  0
    -------
    
    BETSLIPS_INNER
    -------
    ID betslip bet choice
    1  1       1    1
    2  1       2    2
    3  1       3    1
    4  2       4    2
    5  2       3    1
    -------
    

    所以预期的betslip应该是id:1的betslip。第二个betslip内部有一个获胜的比赛,但不是一个“全部比赛”。

    例如,下面的查询;

    SELECT a.bet as bet, a.choice as choice, b.result as result, c.ID as ID, 
    c.won as won
    FROM betslips_inner a 
    JOIN bet b JOIN betslips c ON 
    b.ID=a.bet AND c.ID=a.betslip 
    WHERE a.betslip = 5128919
    

    给我这个,

    bet   choice result ID      won
    66897 2      2      5128919 0
    66895 1      1      5128919 0
    66695 2      2      5128919 0
    38196 2      2      5128919 0
    66995 2      2      5128919 0
    66686 1      1      5128919 0
    66715 1      1      5128919 0
    

    但我在第一次查询时找不到ID为5128919的betslip(我应该是,因为这是一个全匹配的赌注,赢=0)

    1 回复  |  直到 6 年前
        1
  •  1
  •   LukStorms    6 年前

    我有预感你在找下面的SQL之类的东西。

    在下注时使用左连接。

    以及betslips_inner和bets table之间对相同结果的限制。

    SELECT slipin.betslip, 
    COUNT(slipin.ID) as total_inner, 
    COUNT(bet.ID) as total_bet_matching
    FROM BETSLIPS_INNER slipin
    JOIN BETSLIPS slip ON (slip.ID = slipin.betslip)
    LEFT JOIN BETS bet ON (bet.ID = slipin.bet AND bet.result = slipin.choice)
    WHERE slip.won = 0
    GROUP BY slipin.betslip
    HAVING COUNT(slipin.ID) = COUNT(bet.ID);
    

    根据样本数据,它将返回betslip 1。
    但不是贝特斯利普2。

    以下是示例数据:

    create table BETS (ID int, result int);
    create table BETSLIPS (ID int, won int);
    create table BETSLIPS_INNER (ID int, betslip int, bet int, choice int);
    insert into BETS (ID, result)  values (1,1),(3,1),(4,1),(2,2);
    insert into BETSLIPS (ID, won) values (1,0),(2,0);
    insert into BETSLIPS_INNER (ID, betslip, bet, choice) values
    (1,1,1,1),(2,1,2,2),(3,1,3,1),
    (4,2,4,2),(5,2,3,1);