【问题标题】:SUM of a secondSELECT statement - PHP - MySQL第二个SELECT语句的总和 - PHP - MySQL
【发布时间】:2013-07-09 09:38:04
【问题描述】:

我有以下有效的查询...但我需要一些更改:

SELECT
    p.pid,
    p.name,   
    GROUP_CONCAT( gC.leaguepoints ORDER BY leaguepoints DESC ) AS leaguepoints        
FROM
    golf_player p
LEFT JOIN
    golf_card gC ON
    p.pid = gC.pid
GROUP BY
    p.pid
ORDER BY
    p.name
DESC

我真正想要的是返回另一个名为 totalleaguepoints 的属性,它是我表中最近 20 个联赛积分的总和。

如何为 group_concat 添加限制?

可能是这样的?

 SELECT                
      p.pid,
      p.name,   
      GROUP_CONCAT( gC.leaguepoints ORDER BY leaguepoints DESC ) AS leaguepoints, 
      SUM(  
        SELECT 
          gC2.leaguepoints
        FROM
          golf_card gC2
        WHERE 
          gC2.pid = p.pid
        ORDER BY
          leaguepoints
          DESC
        LIMIT 20           
      ) AS totalleaguepoints
  FROM
    golf_player p
  LEFT JOIN
    golf_card gC ON
    p.pid = gC.pid
  GROUP BY
    p.pid
  ORDER BY
    p.name
    DESC               

P.S,上面的查询没有运行

【问题讨论】:

  • How do I add a limit to a group_concat? 你没有在 where 子句中创建过滤器。

标签: php mysql limit group-concat


【解决方案1】:

您是否只想要 group_concat 中每位球员的前 20 名联赛积分以及总和?

如果是这样,可以使用用户变量:-

SELECT                
    p.pid,
    p.name,   
    GROUP_CONCAT( gC.leaguepoints ORDER BY leaguepoints DESC ) AS leaguepoints, 
    SUM(gC.leaguepoints) AS totalleaguepoints
FROM golf_player p
LEFT JOIN 
(
    SELECT pid, leaguepoints, @Sequence:=IF(@PrevPid = pid, @Sequence + 1, 0) AS aSequence, @PrevPid := pid
    FROM
    (
        SELECT pid, leaguepoints
        FROM golf_card 
        ORDER BY pid, leaguepoints DESC
    ) Sub1
    CROSS JOIN (SELECT @PrevPid := 0, @Sequence := 0) Sub2
) gC
ON p.pid = gC.pid AND aSequence < 20
GROUP BY p.pid
ORDER BY p.name DESC 

【讨论】:

  • 如果我得到所有球员,然后在 PHP 中循环通过我的球员并得到他们的联赛号码,那会怎样。这是否比一次查询更有压力?这合理吗?
  • 多次查询一般比较慢。上面的查询应该是相当有效的(虽然没有经过测试)
  • 这比看起来更棘手 :-) 很好的查询,但它还没有工作 ;) pastebin.com/YYAQPnAw
  • Arghh,这需要我一段时间才能理解。这些变量对我来说是新的:'(
  • 它获取按pid排序的记录列表,然后联盟积分降序。一旦有了它,它就会使用用户变量来获取序列。当 pid 更改时,它会将序列设置回 0。因此,您将获得所有记录,每个记录的序列从 0 开始,每个 Leaguepoint 增加 1。然后它只是从序列号小于20的项目中选择项目。
猜你喜欢
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多