【问题标题】:MYSQL MAX/COUNT/IN/DATEMYSQL 最大/计数/日期/日期
【发布时间】:2010-10-26 06:16:16
【问题描述】:

希望你能给点建议。我在一个查询中拉出我的头发,希望你能提供建议。

我有一个表,我想从带有 IN 的日期之间的内部计数中选择 MAX。

View Table

这是我尝试过的,但完全没有运气。

SELECT MAX(no_hits) from (SELECT count(hits) AS 'no_hits' ) FROM stats WHERE 'date' >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH AND zones_code IN('011242077793513596890', '011242077783866125432'))

所以基本上我只希望为表现最好的区域返回一个 no_hits。

希望你能告诉我哪里出错了。

如果你愿意,谢谢你

【问题讨论】:

  • 您能否发布您的统计数据表的定义、一些示例数据和示例结果?

标签: php sql mysql


【解决方案1】:

您的查询是这样的:

SELECT MAX(no_hits) 
FROM (SELECT count(hits) AS 'no_hits' ) FROM stats 
  WHERE 'date' >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH 
    AND zones_code IN('011242077793513596890', '011242077783866125432')
);

您的查询有一些问题:

  • 您关闭了'no_hits' 之后的子查询括号。
  • 您没有为子查询提供表别名。每个派生表都必须有一个表别名。
  • 您没有关闭 DATE_SUB() 函数的括号。
  • 您使用了COUNT(),而我认为您应该使用SUM(),如果您想要每个区域的总点击量。
  • 您没有将点击小计与每个区域相关联;您的小计是针对整个表格的。
  • 您对'date' 使用了字符串定界符(''),而不是标识符定界符(即反引号)。当您将列 date 与日期值进行比较时,您将文字字符串 'date' 与日期值进行比较。

@chaos 的答案中的查询很接近,但我认为你应该使用SUM()

SELECT `zones_code`, SUM(`hits`) AS `no_hits`
FROM `stats`
WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY `zones_code`
ORDER BY `no_hits` DESC
LIMIT 1;

结果是 zone_code 011242077793513596890,共有 255 次点击。


PS:当您在线提问时,请以文本格式提供足够的代码和数据,以便人们轻松测试。您提供了一些示例数据的屏幕截图,但没有显示表创建代码。这不如您提供有效的CREATE TABLE 语句和示例INSERT 语句来填充它那样有用。

CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(11) NOT NULL,
  `zones_code` char(21) default NULL,
  `date` date default NULL,
  `hits` int(11) default NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO stats VALUES
(10, '011242077793513596890', '2009-05-11', 13),
(12, '011242077793513596890', '2009-05-12',235),
(24, '011242077793513596890', '2009-05-13',  2),
(32, '011242077793513596890', '2009-05-14',  5),
(17, '011242077783866125432', '2009-05-12',165),
(22, '011242077783866125432', '2009-05-13',  2),
(30, '011242077783866125432', '2009-05-14',  5),
(19, '011242077743853330663', '2009-05-12', 61),
(20, '011242077737314753388', '2009-05-12', 54),
(28, '011242077737314753388', '2009-05-13',  7),
(36, '011242077737314753388', '2009-05-14', 31),
(14, '011242077730456603312', '2009-05-12',240),
(26, '011242077730456603312', '2009-05-13',  2),
(34, '011242077730456603312', '2009-05-14',  5);

以上是我根据您的屏幕截图输入的内容!

帮自己一个忙,让别人更容易帮助你。

【讨论】:

  • 发表了公正的评论。下次我会发布更多数据。在上一篇文章之后,我确实认为应该使用 SUM 将它们加在一起。再次感谢大家。
【解决方案2】:
SELECT `zones_code`, SUM(`hits`) AS `no_hits`
FROM `stats`
WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY `zones_code`
ORDER BY `no_hits` DESC
LIMIT 1

【讨论】:

  • 接近但不正确。我得到的结果是。 13131313131313131313 ?
  • 我不明白你怎么可能得到那个。在弄清楚发生了什么之前,您可能必须给我们更多的代码上下文。直接在 mysql 客户端或 phpmyadmin 中运行上面的查询会发生什么?
  • @chaos:你在我的测试中查询的结果是“4”。我不知道李在说什么。
  • 是的,那里发生了一些古怪的事情。但是,4 并不完全正确。 (因为我有 COUNT 而不是 SUM。复制和粘贴 OP 的查询得到了什么...)
【解决方案3】:

我会使用带有LIMIT 1ORDER BY DESC 排序子句来仅获得最大值。

【讨论】:

  • 这将为您提供最大值。通过从大到小排序,只取第一个,你会得到最好的结果;由于您的查询中只有一列,这将导致一个标量。
  • 即使我删除了 LIMIT 1 我仍然得到相同的结果?
  • 我不能为你调试你的代码(尤其是没有你的表结构和数据);这旨在作为信息,让您指导您的研究并找到解决方案,而不是调试您的问题。
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多