来自两个不同表的Mysql计数和总和

Posted

技术标签:

【中文标题】来自两个不同表的Mysql计数和总和【英文标题】:Mysql count and sum from two different tables 【发布时间】:2011-02-28 04:15:07 【问题描述】:

我对 phpmysql 中的一些查询有疑问: 我有 2 个不同的表,有一个共同的字段:

表 1

标识 |点击 | num_g |猫 | usr_id |活跃

1 | 10 | 11 | 1 | 53 | 1

2 | 13 | 16 | 3 | 53 | 1

1 | 10 | 22 | 1 | 22 | 1

1 | 10 | 21 | 3 | 22 | 1

1 | 2 | 6 | 2 | 11 | 1

1 | 11 | 1 | 1 | 11 | 1

表 2

标识 | usr_id |积分

1 | 53 | 300


现在我使用这个语句来计算表 1 中每个 id count + 1 的总数

SELECT usr_id, COUNT( id ) + SUM( num_g + hits ) AS tot_h FROM table1 WHERE usr_id!='0' GROUP BY usr_id ASC LIMIT 0 , 15

我得到每个 usr_id 的总数

usr_id| tot_h |

53 | 50

22 | 63

11 | 20

直到这里一切正常,现在我有第二张桌子加分(table2) 我试试这个:

SELECT usr_id, COUNT( id ) + SUM( num_g + hits ) + (SELECT points FROM table2 WHERE usr_id != '0' ) AS tot_h FROM table1 WHERE usr_id != '0' GROUP BY usr_id ASC LIMIT 0 , 15

但似乎将 300 加分加到所有用户身上:

usr_id| tot_h |

53 | 350

22 | 363

11 | 320

现在我如何才能像第一次尝试一样获得总数,但在一个语句中 + 秒表?因为现在我在第二张表中只有一个条目,但我可以在那里更多。 谢谢大家的帮助。


hi thomas 感谢您的回复,我认为这是正确的方向,但我得到了奇怪的结果,例如

usr_id | tot_h

22 | NULL

53 |第1033章

就像第二个用户获取所有值一样。然后我试试这个:

      SELECT table1.usr_id, COUNT( table1.id ) + SUM( table1.num_g + table1.hits + table2.points ) AS tot_h
FROM table1
LEFT JOIN table2 ON table2.usr_id = table1.usr_id
WHERE table1.usr_id != '0'
AND table2.usr_id = table1.usr_id
GROUP BY table1.usr_id ASC          

相同的结果,我只是得到所有值的总和,而不是每个用户,我需要这样的结果:

usr_id | tot_h

53 | 53

22 | 56

/////////我需要的结果///////////

usr_id | tot_h

53 | 353

22 | 156

我认为结构需要是这样的 伪语句;)

从table1计算所有id得到usr_id为sum hits + num_g的记录数,从table2中选择usr_id与table1相同的额外点并得到结果:

usr_id | tot_h

53 | 353

22 | 156

【问题讨论】:

【参考方案1】:

您的子查询中没有任何内容可以计算额外点以将其与外部 Table1 相关联。因此,一种解决方案是添加该相关性:

SELECT usr_id
    , COUNT( id ) + SUM( num_g + hits ) 
    + (SELECT points 
        FROM table2 
        WHERE table2.usr_id = table1.usr_id ) AS tot_h 
FROM table1 
WHERE usr_id != '0' 
GROUP BY usr_id ASC 
LIMIT 0 , 15

另一种解决方案是直接加入它:

SELECT table1.usr_id
    , COUNT( table1.id ) 
        + SUM( table1.num_g + table1.hits + table2.points ) 
        AS tot_h 
FROM table1 
    Left Join table2
        On table2.usr_id = table1.usr_id
WHERE table1.usr_id != '0' 
GROUP BY table1.usr_id ASC 
LIMIT 0 , 15

【讨论】:

【参考方案2】:

我想得到解决方案,我不知道它是否是最好的,但它对我有用,如果你知道优化它的方法,我真的很感激。

SELECT usr_id , COUNT( id ) + SUM( num_g + hits )as sumtot ,
      (SELECT points FROM table2  WHERE usr_id = table1.usr_id ) AS tot_h
FROM table1
WHERE usr_id != '0'
GROUP BY usr_id ASC

有了这个,我得到了这样的东西

usr_id |sumtot | tot_h

5 |557 |空

53 |2217 | 300

那么我只是将结果求和并在while循环中显示。

<?php
//some mysql here
//then the while loop
// and then the final sum

$final_result=$r_rank['tot_h']+$r_rank['sumtot'];

 ?>

非常感谢您的帮助托马斯 :)

【讨论】:

以上是关于来自两个不同表的Mysql计数和总和的主要内容,如果未能解决你的问题,请参考以下文章

结合两个查询并获得计数的总和

MySQL JOIN 2 个表并分别获取两个表的总和

将联合与laravel结合使用时如何获得两个不同表的总和

同一表的不同列的计数总和

来自多个表的 MySQL 最新相关记录

MySQL:来自子查询的总和