我在php和mysql中遇到一些问题: 我有两个不同的表,共有一个字段:
表1
id |点击| num_g |猫| usr_id | active
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
现在我使用这个语句来计算表1中每个id计数+ 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
现在我如何能够像第一次尝试一样获得总数而在一个声明中获得+ 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< ====加上表2上的300分
22 | 156< ====加上table2上的100分
我认为结构必须是这样的 伪陈述;)
来自table1的计算所有id以获取记录的数量,其中usr_id然后是和hits + num_g,并且从table2中选择usr_id与table1相同的额外点并得到结果:
usr_id | tot_h
53 | 353
22 | 156
答案 0 :(得分:3)
子查询中没有任何内容可以计算额外的点以将其与外部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
答案 1 :(得分:0)
我认为得到解决方案,我不知道它是否是最好的,但它对我有用,如果你知道一种优化方法,我真的很喜欢它。
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 | NULL
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'];
?>
非常感谢你的帮助托马斯:)