簡體   English   中英

來自兩個不同表的MySQL計數和總和

[英]Mysql count and sum from two different tables

我在php和mysql中有一些查詢問題:我有2個不同的表,其中一個字段相同:

表格1

id | 點擊 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

id | usr_id | 點數

1 | 53 | 300


現在,我使用此語句對每個id計數+ 1也只匯總表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

直到這里一切都OK,現在我有了另一個帶有加分的表(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

現在,我如何才能像第一次嘗試一樣獲得總計,但在一條語句中加上secon表? 因為現在我在第二張表中只有一個條目,但是我可以在其中更多。 感謝所有的幫助。


嗨,托馬斯,謝謝您的答復,我認為方向是正確的,但是我得到的結果很奇怪,例如

usr_id | tot_h

22 | NULL <==我認為它是null,因為usr_id作為table2中的無值

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 <====加table1上的300點

22 | 56 <====加table2上的100分

//////////我需要的結果/////////////

usr_id | tot_h

53 | 353 <====在table2上加300點

22 | 156 <====加上table2的100點

我認為結構需要像這樣的偽語句;)

從table1計數所有id以獲取usr_id為總和+ num_g的記錄數,並從table2選擇usr_id與table1相同的加點,並得到結果:

usr_id | tot_h

53 | 353

22 | 156

子查詢中沒有任何東西可以計算額外的點以將其與外部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

我想得到解決方案,我不知道它是否是最好的,但是對我有用,如果您知道一種優化方法,我真的很感激。

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'];

 ?>

非常感謝您對托馬斯的幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM