GROUP BY 条件给我一些真实结果

Posted

技术标签:

【中文标题】GROUP BY 条件给我一些真实结果【英文标题】:GROUP BY with condition giving me some part of real results 【发布时间】:2018-07-22 15:55:57 【问题描述】:

我有三个表来维护 mysql 中的投注系统。我们的用户说,不知何故,有些投注单即使中奖了也没有改变“中奖状态”。所以我正在寻找这些错误的结果。很快,我需要来自 betslips 表的 ID,这些 ID 具有来自 betslips_inner 表的匹配选项(都应该是匹配的)以及来自 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
-------

所以预期的投注单应该是 ID:1 的投注单。第二个投注单里面有一场获胜的比赛,但不是“全场比赛”。

例如,下面的查询;

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 的投注单。 (我应该是,因为这是一张全场比赛的投注单,won=0)

【问题讨论】:

样本数据和期望的结果真的很有帮助。 b.won=0 移出 JOIN 子句并移入 WHERE 子句时会发生什么? @GordonLinoff 我已经更新了我的问题。 @IVOGELOV 它给了我同样的结果。 您对示例数据应用的查询给出了所需的答案 - ID:1 【参考方案1】:

我有一种预感,您正在寻找类似下面的 SQL 的东西。

在 BETS 上使用 LEFT JOIN。

并且 HAVING 限制了 BETSLIPS_INNER 和 BETS 表之间的相同结果。

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);

【讨论】:

谢谢,我要试试这个,但很难理解什么是滑台。 它只是 BETSLIPS_INNER 的别名。 ;) 你刚刚结束了我绝望的噩梦。谢谢好心的陌生人!也从这个线程中学到了很多关于 SQL 的知识。 嗯,很好,它有帮助。 :) 但是您可能注意到了一些差异。一件事是最好将 ON 子句与它们所属的 JOIN 放在一起。使 SQL 更具可读性。因为 JOIN 语法旨在将链接条件与搜索条件分开。

以上是关于GROUP BY 条件给我一些真实结果的主要内容,如果未能解决你的问题,请参考以下文章

Group By 结果作为单独的列名

db#group_by

RedShift GROUP BY 常量列给出不一致的结果

SQL如何先用group by分组,并将分组的结果distinct?

having和group by的区别?

C# Linq group by 和 group by into 运用实例