PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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

sqlfiddle:@L_489_7@

问题在于它计算平均值中的所有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,请注明来意。
标签: