Mysql SQL查询选择计数&;从使用另一个表的表求和

Mysql SQL查询选择计数&;从使用另一个表的表求和,mysql,Mysql,我试图在使用B时获取a中特定列的总和和计数,B是另一个表,其中B.CheckerID不为NULL,a.DBDivRecID='3485' 因此,它将获得A中的总和和计数,其中B.CheckerID不为NULL A.DBDivRecID='3485' 我这样做了,但是我得到了表A和表B组合的结果,我发现两个表的DBShares列的名称相同,我只需要表A的总DBShares,只需要表B来检查CheckerID SELECT SUM(A.DBShares) As totalshares,COUNT(*

我试图在使用B时获取a中特定列的总和和计数,B是另一个表,其中
B.CheckerID不为NULL,a.DBDivRecID='3485'

因此,它将获得A中的总和和计数,其中
B.CheckerID不为NULL A.DBDivRecID='3485'

我这样做了,但是我得到了表A和表B组合的结果,我发现两个表的DBShares列的名称相同,我只需要表A的总DBShares,只需要表B来检查CheckerID

SELECT SUM(A.DBShares) As totalshares,COUNT(*) As totalcounts 
FROM ShrDivBenf As A 
INNER JOIN TEMPDRP_3485 AS B ON A.DBDivRecID=B.DBDivRecID 
WHERE B.CheckerID IS NOT NULL AND A.DBDivRecID='3485'
我想要这样的东西(表B中的CheckerID不为null

样品

表A

+------------+----------+-------+
| DBDivRecID | DBShares |Name   |
+------------+----------+-------+
|       3485 |     5000 |John   |
|       3485 |     6000 |Mary   |
|       3485 |     7000 |Sam    |
+------------+----------+-------+
表B

+------------+-----------+----------+--------+
| DBDivRecID | CheckerID | DBShares | DBName |
+------------+-----------+----------+--------+
|       3485 |      4555 |     5000 | John   |
|       3485 |      4555 |     6000 | Mary   |
|       3485 |      4555 |     7000 | Sam    |
|       3485 |      NULL |     8000 | Derek  |
+------------+-----------+----------+--------+
假设我这样做了

SELECT A.DbName, A.DbShares 
FROM ShrDivBenf As A 
INNER JOIN TEMPDRP_3485 AS B ON A.DBDivRecID=B.DBDivRecID 
WHERE B.CheckerID IS NOT NULL AND A.DBDivRecID='3485'
我会得到这个(即使我的数据库只有1个John、Mary和Sam,它也会重复整个过程)


由于有多行具有相同的
DBDivRecID
,因此在加入时将得到笛卡尔乘积。避免这种情况的一种方法是将
join
替换为
in
操作符:

SELECT SUM(A.DBShares) As totalshares, COUNT(*) As totalcounts 
FROM   ShrDivBenf
WHERE  DBDivRecID='3485' AND
       DBDivRecID IN (SELECT DBDivRecID 
                      FROM   TEMPDRP_3485
                      WHERE  CheckerID IS NOT NULL)

我想我明白你想要什么;您正在查找没有空检查程序的记录。鉴于此,请尝试以下方法:

SELECT SUM(A.DBShares) As totalshares, COUNT(*) As totalcounts 
FROM   ShrDivBenf
WHERE  DBDivRecID='3485' AND
   DBDivRecID NOT IN (SELECT DBDivRecID 
                  FROM   TEMPDRP_3485
                  WHERE  CheckerID IS NULL)

什么工作不正常?总和是否太大,计数是否太高(意味着您加入的列太少,并且得到了重复的列),或者是否存在其他问题?您是否可以将ShrDivBenf中Select count(*)的总和视为where a.DBDivRecID='3485'?这是否低于从联接中获得的计数?您的查询没有问题。请打印输出。我想你会发现输出不是你上面所说的。@DerekToh。使用示例数据和所需结果编辑您的问题。我认为我使用了内部联接错误。。我只想得到一段时间使用“是”的结果,我尝试了这个方法,但我发现即使那些CheckerID为NULL的方法也有DBDivRecID='3485'@DerekToh,我不明白你想说什么。请你详细说明一下好吗?我编辑了表B,还有什么我可以直接得到CheckerID的吗?@DerekToh你能用你想要得到的结果编辑这个问题吗?
SELECT SUM(A.DBShares) As totalshares, COUNT(*) As totalcounts 
FROM   ShrDivBenf
WHERE  DBDivRecID='3485' AND
       DBDivRecID IN (SELECT DBDivRecID 
                      FROM   TEMPDRP_3485
                      WHERE  CheckerID IS NOT NULL)
SELECT SUM(A.DBShares) As totalshares, COUNT(*) As totalcounts 
FROM   ShrDivBenf
WHERE  DBDivRecID='3485' AND
   DBDivRecID NOT IN (SELECT DBDivRecID 
                  FROM   TEMPDRP_3485
                  WHERE  CheckerID IS NULL)