MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

Posted

技术标签:

【中文标题】MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题【英文标题】:MYSQL: Problems using COUNT and SUM functions in multi row select 【发布时间】:2012-04-09 13:12:48 【问题描述】:

我正在尝试创建一个从数据库中轮流选择广告的过程。并最终返回选中的广告行并增加浏览量。

我目前正在处理的部分应该

    从“广告”表中提取结果,其中“城市”与给定城市匹配,“地点”与给定地点名称匹配。 添加一个额外的“num”列来枚举结果行。 从这些结果中,选择“num”列与 SUM('views') % COUNT(id) 匹配的行

只要我在最终选择并返回广告时增加视图列,这应该允许我轮流显示广告

我目前正在处理的代码是......

SET @t1=-1;

SELECT * 
  FROM (SELECT @t1 := @t1+1 AS num, ads.* 
          FROM ads 
         WHERE city = 'Maitland' 
           AND spot = 'home-banner' 
      ORDER BY id ASC) dt 
 WHERE dt.num = SUM(dt.views) % COUNT(dt.id);

...但是我遇到了 SUM 和 COUNT 函数的问题。我收到无效使用组功能错误。我也尝试过将函数移到子查询内部,但由于某种原因,这会导致子查询只返回一个结果。

子查询结果

num id  spot    city    views
0   1   home-banner Maitland    0
1   2   home-banner Maitland    2
2   3   home-banner Maitland    0
3   4   home-banner Maitland    0
4   5   home-banner Maitland    0
5   6   home-banner Maitland    0

【问题讨论】:

【参考方案1】:

试试这个:

SELECT * FROM (
  SELECT @t1 := @t1 + 1 AS num, ads.*
  FROM ads, (SELECT @t1 := -1) init
  WHERE city = 'Maitland' AND spot = 'home-banner'
  ORDER BY id ASC
) dt
WHERE dt.num = (
  SELECT SUM(views) % COUNT(id) FROM ads
  WHERE city = 'Maitland' AND spot = 'home-banner')

【讨论】:

谢谢,但这不会计算整个广告表的视图模数和计数,而不是子查询的结果吗?我只关心匹配城市和地点的结果。我想我可以重复 WHERE 子句,但这不是双重职责吗? 你说得对,我错过了 WHERE 子句。是的,这将花费更长的时间,但这是我能想到的唯一方法:(您还可以创建一个临时表并存储所有当前城市和现场数据,然后查询该表以获取 sumcount 好的,希望在实践中不会太糟糕。感谢临时表的建议,也许那会是更好的路线。最终,我将为同一个城市拉出多个广告位(10 个左右)。

以上是关于MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中使用sum() over(Partition by)组合多行数据

使用类从MySQL获取多行[关闭]

MySQL - 在一个查询中从不同表中选择多行

从 MySQL 表中为 1 个用户选择多行

MySQL—— 分组函数(多行处理函数)

在单个窗体中更新多行