【问题标题】:Mysql query to find hackers who made at least 1 submission each dayMysql查询查找每天至少提交1次的黑客
【发布时间】:2016-10-28 09:14:55
【问题描述】:

我想找出每天提交至少 1 次的所有黑客。

表格看起来像:id、日期。

1, 2016-01-01
2, 2016-01-01
3, 2016-01-01
1, 2016-01-02
2, 2016-01-02
1, 2016-01-03

所以输出应该是: 1 由于1一整天都在提交。

我试过的是:

Select id from table 
group by id
having count(*)=3 /* Since number of days are 3 */

但这是不正确的,因为黑客可以在一天内提交多次。 我的查询将失败的示例:

1, 2016-01-01
2, 2016-01-01
3, 2016-01-01
3, 2016-01-01
3, 2016-01-01
1, 2016-01-02
2, 2016-01-02
1, 2016-01-03

这个解决后,原来的问题是:

编写查询以打印每天至少提交的唯一黑客总数(从比赛的第一天开始),并找到每天提交最大数量的黑客的hacker_id 和名称。如果不止一个这样的黑客有提交的最大数量,打印最低的hacker_id。查询应打印比赛每一天的此信息,按日期排序

【问题讨论】:

  • 或者,您能想出一个查询来查找所有没有每天提交的黑客吗?您想要的结果将与此相反。

标签: mysql


【解决方案1】:

我相信,如果您同时按 iddate 分组,您会得到您想要的。即:

SELECT id
FROM table 
GROUP BY id, `date`
HAVING COUNT(*) = 3 /* Since number of days are 3 */

请注意,这假设您从其他地方获取基于某个日期范围的天数(在本例中为 3)。

【讨论】:

  • 写一个查询来打印每天至少提交的唯一黑客总数(从比赛的第一天开始),并找到最多提交次数的黑客的hacker_id和名称每天提交。如果不止一个这样的黑客有提交的最大数量,打印最低的hacker_id。查询应打印比赛每一天的此信息,按日期排序。
  • 您不能在同一个查询中返回“唯一黑客总数”和“找到hacker_id 和名称”——这对我来说似乎是两个不同的查询。话虽如此,要实现您的第二个请求,您必须加入一个子选择。假设您没有非常多的行,另一种方法是根据上述查询返回所有符合条件的行 - 即将COUNT(*) AS total 添加到选择中,并在末尾添加ORDER BY total DESC, id ASC - 然后让应用程序逻辑采用每个日期的第一行。你应该尝试两种方法,然后问另一个问题。我这里没有足够的空间。
  • 显然现在这不起作用。请立即使用下面的@Gordon Linoff 答案。
  • @Krissh 它有效 - 有关问题数据的工作示例,请参阅sqlfiddle.com/#!9/00f96d/1
【解决方案2】:

我会这样说:

select id
from t
group by id
having count(distinct date) = (select count(distinct date) from t);

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 2015-02-19
    • 2022-01-06
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多