GROUP BY 有条件给我一些真实结果
GROUP BY with condition giving me some part of real results
我有 3 个 table 来维护 MySQL 中的投注系统。我们的用户说,有些投注单即使赢了也没有改变 "won status"。所以我正在寻找这些错误的结果。很快,我需要来自投注单 table 的 ID,它具有来自 betslips_inner table 的匹配选项(所有应该是匹配项)以及来自投注 table.
的投注结果
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 的投注单。第二张投注单内有一场获胜比赛,但没有 "all-match".
例如下面的查询;
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 的投注单。 (我应该是,因为它是赢=0 的全场投注单)
我有一种预感,您正在寻找类似下面 SQL 的内容。
在 BETS 上使用 LEFT JOIN。
并且 BETSLIPS_INNER 和 BETS table 之间的相同结果的 HAVING 限制。
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);
根据示例数据,它将 return 投注单 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);
我有 3 个 table 来维护 MySQL 中的投注系统。我们的用户说,有些投注单即使赢了也没有改变 "won status"。所以我正在寻找这些错误的结果。很快,我需要来自投注单 table 的 ID,它具有来自 betslips_inner table 的匹配选项(所有应该是匹配项)以及来自投注 table.
的投注结果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 的投注单。第二张投注单内有一场获胜比赛,但没有 "all-match".
例如下面的查询;
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 的投注单。 (我应该是,因为它是赢=0 的全场投注单)
我有一种预感,您正在寻找类似下面 SQL 的内容。
在 BETS 上使用 LEFT JOIN。
并且 BETSLIPS_INNER 和 BETS table 之间的相同结果的 HAVING 限制。
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);
根据示例数据,它将 return 投注单 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);