【问题标题】:MySQL: Growth in Column Value for Given Foreign Key and Specific Date RangeMySQL:给定外键和特定日期范围的列值增长
【发布时间】:2013-08-19 19:31:55
【问题描述】:

我的数据库中有一个表格,我每天都会更新给定 URL (page_id) 在 Pinterest 上的 pin 数量。 如何编写一个查询来返回给定日期范围内增长最快的 page_id?

通常,我计划设置 @StartDate = YESTERDAY 并设置 @EndDate = Today,但我希望灵活地调整查询中的日期。

这是我的 pin 表的当前架构:

mysql> describe pins;
+---------+---------+------+-----+---------+----------------+
| Field   | Type    | Null | Key | Default | Extra          |
+---------+---------+------+-----+---------+----------------+
| id      | int(11) | NO   | PRI | NULL    | auto_increment |
| page_id | int(11) | NO   | MUL | NULL    |                |
| date    | date    | YES  |     | NULL    |                |
| pins    | int(11) | YES  |     | NULL    |                |
+---------+---------+------+-----+---------+----------------+

这是我需要您帮助的查询的所需输出:

mysql> [fancy-mysql-query] ORDER BY Pins_DayOverDay DESC LIMIT 1;

+-------------------+---------------------------+
| page_id           | Pins_DayOverDay           |
+-------------------+---------------------------+
|             12345 |                     12345 |
+-------------------+---------------------------+

任何帮助将不胜感激!

【问题讨论】:

  • 不清楚“pin数量”是每日增量(净值变化),还是累计总数(截至给定日期有效的pin数量)。跨度>
  • 是累计总数。

标签: mysql


【解决方案1】:

如果pins 列是每日增量,则在给定日期添加/删除的引脚数量的净变化,则:

SELECT @StartDate = DATE_FORMAT(NOW(),'%Y-%m-%d') + INTERVAL -1 DAY
SELECT @EndDate   = DATE_FORMAT(NOW(),'%Y-%m-%d')

SELECT t.page_id
     , SUM(t.pins) AS `Pins_DayOverDay`
  FROM mytable t
 WHERE t.date >= @StartDate
   AND t.date <= @EndDate
 GROUP
    BY t.page_id
 ORDER BY `Pins_DayOverDay` DESC
 LIMIT 1 

如果pins 列是累积的并且包含有效引脚数(前几天完成的引脚加上今天添加/删除的引脚)的总数,假设(page_id,date) 是唯一的:

SELECT t.page_id
     , (t.pins - s.pins) AS `Pins_DayOverDay`
  FROM mytable t
  JOIN mytable s
    ON s.page_id = t.page_id
 WHERE t.date = @EndDate
   AND s.date = @StartDate
 GROUP
    BY t.page_id
 ORDER BY `Pins_DayOverDay` DESC
 LIMIT 1

上面的查询假设(page_id,date) 是唯一的。如果相同的 page_id 可以有多个具有相同 date 的行,那么我们需要添加聚合函数。 (如果您需要,我会提供该查询。)

【讨论】:

  • 感谢您的明确回复。 @StartDate@EndDate 变量语句返回 null。即使我手动设置它们,查询也会为每个 page_id 返回 0。这是查询:SELECT t.page_id, (t.pins - s.pins) AS 'Pins_DayOverDay' FROM pins t JOIN pins s ON s.page_id = t.page_id WHERE t.date = @EndDate AND s.date = @StartDate GROUP BY t.page_id ORDER BY 'Pins_DayOverDay' DESC LIMIT 1;
  • 我想我发现了问题所在。前 10 个 pages_id 昨天没有任何增长(这就是他们返回 0 的原因)。当我将查询更改为:... ORDER BY (t.pins - s.pins) ... 时,它返回了增长最快的 page_id。看起来 GROUP BY 语句不适用于别名。感谢您的所有帮助!
  • @Abundnce10:您的查询在 ORDER BY 子句中显示字符串文字。对列别名的引用可以用反引号括起来,但不能用单引号括起来。 MySQL 将单引号视为字符串文字,而不是标识符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2021-07-02
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多