MySQL - 按月查找前 10 条记录

标签 mysql group-by union

我将以表结构作为序言:

revshare r:包含购买信息,包括 orderNo、销售、佣金、itemid、EventDate

Products p:包含有关产品的信息,包括 PID(产品 ID),用于连接到商家表以获取商家信息。

Merchants m:包含有关购买产品的商家的信息,包括 MerchantName

问题

我正在尝试创建一个 MySQL 查询,以提取给定月份按佣金总和排序的前 10 个 itemid。我想要获取的整个数据集是从 2011 年到 2013 年,因此每年将填充 120 条记录(每月 10 条)。

我创建了一个查询来提取 1 个月的数据,并计划使用 UNION ALL 创建一个记录列表,每个查询包含 10 条记录(每个单独的查询代表一个月前 10 个 itemid)。

查询 1

此查询根据给定月份期间这些项目的总佣金准确地返回前 10 个 itemid。

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-01-01' and '2011-01-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10

当我尝试将此查询与另一个查询联合起来以便我可以获取下个月在“2011-02-01”和“2011-02-31”之间的记录时,我收到错误消息“错误:不正确地使用 UNION 和ORDER BY” 我知道这是因为显然你不能在任何一组 UNION 查询上使用 ORDER BY,除了最后一个。我可以拉取整个数据集,然后使用 Excel 或 Pentaho BI 仅显示前 10 名,但基于 yield 共享表中的庞大数据集,这样做效率不高。

下面是 UNION ALL 无效的查询。有没有人有更好的方法来提取这些数据?

非常感谢任何帮助。

问候, -克里斯

查询 2(由于 ORDER BY 语句而不起作用)

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-01-01' and '2011-01-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10

UNION ALL

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-02-01' and '2011-02-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10

最佳答案

好的,试试这个....

SELECT * FROM (
  SELECT 
    m.MerchantName, 
    Count(r.OrderNo), 
    sum(r.commission)
  FROM
    revshare r
    LEFT JOIN Products p ON r.itemid = p.PID
    LEFT JOIN Merchants m ON p.MID = m.MID
  WHERE
    r.EventDate between '2011-01-01' and '2011-01-31'
  GROUP by
    r.itemid
  ORDER by 
    3 DESC LIMIT 10
) AS RESULT1

UNION ALL

SELECT * FROM (
  SELECT 
    m.MerchantName, 
    Count(r.OrderNo), 
    sum(r.commission)
  FROM
    revshare r
    LEFT JOIN Products p ON r.itemid = p.PID
    LEFT JOIN Merchants m ON p.MID = m.MID
  WHERE
    r.EventDate between '2011-02-01' and '2011-02-31'
  GROUP by
    r.itemid
  ORDER by
    3 DESC LIMIT 10
) AS RESULT2

关于MySQL - 按月查找前 10 条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15533929/

相关文章:

mysql - 从两个 MySQL 表中选择并分组

mysql - 如何处理 200 万件产品

php - session 启动 PHP 错误消息无法发送 session 缓存限制器 - header 已发送

mysql - 如何按间隔对 sql 查询中的结果进行分组?

mysql - 仅从 Laravel 中的日期时间选择月份

mysql - 查询相关成员

mysql - 如何将存储过程的参数传递到所选列表?

MYSQL:帮助连接三个表

mysql - 在 MySQL 中按顺序、分组和按日期枚举记录

mysql - 简单 MySQL 递归上的 Union