左联接复制并计数所有行

时间:2018-12-15 05:51:38

标签: mysql sql

我正在尝试执行下面的查询,但结果不同,但没有成功。

SELECT a.Nome
      ,c.Saldo
      ,COUNT(d.Apostador_ID) AS Depositos
      ,COUNT(s.Apostador_ID) AS Saques
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Deposito d ON a.ID = d.Apostador_ID
LEFT JOIN Saque s ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo

正在返回:

Nome    Saldo   Depositos   Saques  
Marcos  4857      180        180    
Paulo   2868      180        180    
Mariana 8348      180        180    
Marcela -3512     180        180    
Mario   -2367     180        180    
Maria   -3359     180        180    

但是每个结果应该是27。

谢谢!

编辑1:

INSERT INTO Apostadores
    (`ID`, `Nome`, `CPF`, `Email`)
VALUES
    (NULL, 'Marcos', '12345678901', 'marcos@email.com'),
    (NULL, 'Paulo', '12345678902', 'paulo@email.com'),
    (NULL, 'Mariana', '12345678903', 'mariana@email.com'),
    (NULL, 'Marcela', '12345678904', 'marcela@email.com'),
    (NULL, 'Mario', '12345678905', 'mario@email.com'),
    (NULL, 'Maria', '12345678906', 'maria@email.com');


INSERT INTO Contas
    (`ID`, `Apostador_ID`, `Saldo`)
VALUES
    (NULL, '1', '700.00'),
    (NULL, '2', '1000.00'),
    (NULL, '3', '5000.00'),
    (NULL, '4', '250.00'),
    (NULL, '5', '365.00'),
    (NULL, '6', '391.82');

INSERT INTO Deposito
    (`ID`, `Apostador_ID`, `Valor_Depositado`)
VALUES
    (NULL, '1', '700'),
    (NULL, '2', '900'),
    (NULL, '3', '580'),
    (NULL, '4', '260'),
    (NULL, '5', '360'),
    (NULL, '6', '154'),
    (NULL, '1', '1000'),
    (NULL, '2', '1346'),
    (NULL, '3', '2005'),
    (NULL, '4', '360'),
    (NULL, '5', '392'),
    (NULL, '6', '182'),
    (NULL, '1', '362'),
    (NULL, '2', '182'),
    (NULL, '3', '270'),
    (NULL, '4', '390'),
    (NULL, '5', '160'),
    (NULL, '6', '380'),
    (NULL, '1', '290'),
    (NULL, '2', '370'),
    (NULL, '3', '193'),
    (NULL, '4', '256'),
    (NULL, '5', '509'),
    (NULL, '6', '536'),
    (NULL, '1', '500'),
    (NULL, '2', '190'),
    (NULL, '3', '160'),
    (NULL, '4', '380'),
    (NULL, '5', '190'),
    (NULL, '6', '170');


INSERT INTO Saque
    (`ID`, `Apostador_ID`, `Valor_Sacado`)
VALUES
    (NULL, '1', '100'),
    (NULL, '2', '200'),
    (NULL, '3', '100'),
    (NULL, '4', '50'),
    (NULL, '5', '55'),
    (NULL, '6', '70'),
    (NULL, '1', '80'),
    (NULL, '2', '90'),
    (NULL, '3', '65'),
    (NULL, '4', '55'),
    (NULL, '5', '45'),
    (NULL, '6', '60'),
    (NULL, '1', '35'),
    (NULL, '2', '61'),
    (NULL, '3', '99'),
    (NULL, '4', '66'),
    (NULL, '5', '55'),
    (NULL, '6', '33'),
    (NULL, '1', '88'),
    (NULL, '2', '15'),
    (NULL, '3', '20'),
    (NULL, '4', '29'),
    (NULL, '5', '36'),
    (NULL, '6', '58');

这是上面的示例。我添加了4个表格,即Apostadores,Depositos,Saque和Contas。 我尝试过DISTINCT,但没有成功。

编辑2: 如果我尝试下面的查询,我可以为所有行获取正确的值,但是如果我再执行以下查询的联接,则会带来错误的值

SELECT a.Nome
      ,c.Saldo
      ,COUNT(d.ID)
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
GROUP BY a.Nome, c.Saldo

这是带来错误值的查询。

SELECT a.Nome
      ,c.Saldo
      ,COUNT(d.ID)
      ,COUNT(s.ID)
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
LEFT JOIN Saques s ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo

3 个答案:

答案 0 :(得分:0)

要获得相同的结果,您需要为Saldo属性包括求和函数

SELECT a.Nome
      ,SUM(c.Saldo)
      ,COUNT(d.Apostador_ID) AS Depositos
      ,COUNT(s.Apostador_ID) AS Saques
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Deposito d ON a.ID = d.Apostador_ID
LEFT JOIN Saque s ON a.ID = s.Apostador_ID
GROUP BY a.Nome

答案 1 :(得分:0)

问题在于您要沿着不同的维度进行连接。并且,count()仅计算非NULL的值。

通常最好的解决方案是在您JOIN之前汇总 。  不过,一种简单的解决方案是使用COUNT(DISTINCT)

SELECT a.Nome, c.Saldo
       COUNT(DISTINCT d.id) AS Depositos
       COUNT(DISTINCT s.id) AS Saques
FROM Apostadores a LEFT JOIN
     Contas c
     ON a.ID = c.Apostador_ID LEFT JOIN
     Deposito d
     ON a.ID = d.Apostador_ID LEFT JOIN
     Saque s
     ON a.ID = s.Apostador_ID
GROUP BY a.Nome, c.Saldo

答案 2 :(得分:0)

我在下面的查询中更改了一些内容,我不知道该怎么办,并且现在可以正常工作!

谢谢您的帮助!

SELECT a.Nome
      ,c.Saldo
      ,COUNT(DISTINCT d.ID) AS Depositos
      ,COUNT(DISTINCT s.ID) AS Saques
      ,SUM(d.Valor_Depositado) AS Valor_Depositado
      ,SUM(s.Valor_Sacado) AS Valor_Sacado
      ,COUNT(DISTINCT t.ID) AS Transferencias_Efetuadas
      ,SUM(t.Valor_Transferido) AS Valor_Enviado_Transferencia
      ,COUNT(DISTINCT ap.ID) AS Quantidade_Apostas
      ,SUM(ap.Valor_Apostado) AS Valor_Apostado
FROM Apostadores a
LEFT JOIN Contas c ON a.ID = c.Apostador_ID
LEFT JOIN Depositos d ON a.ID = d.Apostador_ID
LEFT JOIN Saques s ON a.ID = s.Apostador_ID
LEFT JOIN Transferencias t ON a.ID = t.Origem_Apostador_ID
LEFT JOIN Apostas ap ON a.ID = ap.Apostador_ID
GROUP BY a.Nome, c.Saldo