大佬教程收集整理的这篇文章主要介绍了php-SQL内部联接和限制记录,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我拥有的简化表结构.
我有两张桌子.
TABLE 1
ID PTS PID TID
----------------------------------------
1 3 1 22
2 10 1 22
3 5 1 22
4 1 2 58
5 0 2 58
7 0 3 47
8 5 3 47
15 5 4 51
15 3 4 51
9 7 3 6
10 0 1 8
11 2 1 8
12 4 5 1
13 1 6 9
14 2 5 12
15 5 4 61
15 6 4 61
15 2 4 61
16 0 7 100
ect. ect. ect. ect.
TABLE 2
NAME PID
-------------------
Jhon 1
Peter 2
Lisa 3
Doe 4
Joey 5
Mike 6
Debby 7
ect. ect.
现在,我需要从每个TID中选择最新的两个PTS,并将它们与表2上的PID行匹配,然后计算平均值.
THE DESIRED OUTCOME
NAME AVG
-------------------
Jhon 4,25
Peter 1,00
Lisa 6,00
Doe 4,00
Joey 3,00
Mike 1,00
Debby 0,00
ect. ect.
澄清:PID行是关系型的.多个TID可以具有相同的PID,而TID可以具有多个PTs.我正在使用PDO插座.
当时我的查询是:
$query = $db->prepare("SELECT IFNULL(AVG(pts), 0) AS P, TA1.PID AS TA1PID, name AS N FROM ".
"table1 TA1 LEFT JOIN table2 TA2 ON TA1.PID = TA2.PID ".
"GROUP BY name, TA2.PID ".
"ORDER BY TA1.id DESC");
但这将从TID计算所有点(PTS).但我只想计算每个TID的两个最新点(PTS).我整天都尝试过不同的查询,但我无法弄清楚.我对sql很陌生,我设法得到了一个示例,但是使用纯PHP却不是很好:D
问题在于它计算平均值中的所有TID点.它仅应计算每个TID的最后两个条目
我希望这是一个明确的问题.我已尽力解释我的问题.如有任何疑问,请询问.我在Stackoverflow上阅读了除我以外的其他类似问题,但我无法修改它们以适合我.
解决方法:
您可以使用此查询从第一张表中仅选择最近的2行
SELEct t1.id, t1.pts, t1.pid, t1.tid
from table1 t1
join table1 t2 on t2.id >= t1.id and t1.tid = t2.tid
group by t1.id
having count(*) <= 2
并将其插入原始查询而不是表1
SELECT IFNULL(AVG(pts), 0) AS AVG, TA1.PID AS
Table1_ID, name AS Name FROM
(
SELEct t1.id, t1.pts, t1.pid, t1.tid
from table1 t1
join table1 t2 on t2.id >= t1.id and t1.tid = t2.tid
group by t1.id
having count(*) <= 2
)
TA1 LEFT JOIN table2 TA2 ON TA1.PID = TA2.PID
GROUP BY name, TA2.PID
ORDER BY TA1.id DESC
以上是大佬教程为你收集整理的php-SQL内部联接和限制记录全部内容,希望文章能够帮你解决php-SQL内部联接和限制记录所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。