我有一个可怕的 MYSQL 心理障碍,我一生都无法弄清楚这个简单的查询。当我看到正确的答案时,我确信我最终会踢自己一脚......那些日子之一。
* 手指交叉 * :)
好了,别笑了。
表名称:url
id hostname_id url user_id
------ ----------- ------------ ----------------
1 15 loc.com/xxx 2
2 15 loc.com/ab2 2
3 15 loc.com/cdf 3
4 15 loc.com/xx7 1
5 17 yax.com/21sv 3
6 17 yax.com/148g 3
----------------------------------------------------
这是所需的查询结果
hostname_id | hostname_id_COUNT |user_id_COUNT
----------- ------------ ----------------
15 4 3
17 2 1
我尝试了多种方法,例如连接、按计数分组。就我个人而言,如果由我决定,我会使用map/Reduce,但数据库固定为mysql,解决方案必须为MySql。
有人可以帮助我摆脱这个令人尴尬的心理障碍吗? :) 非常感谢!提前为您安排时间。
我上面发布的示例的示例数据。
CREATE TABLE `testing`.`urls` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`hostname_id` INT(10) UNSIGNED DEFAULT NULL,
`url` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` INT(10) UNSIGNED DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('15', 'loc.com/xxx', '2');
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('15', 'loc.com/ab2', '2');
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('15', 'loc.com/cdf', '3');
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('15', 'loc.com/xx7', '1');
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('17', 'yax.com/21sv', '3');
INSERT INTO `testing`.`urls` (`hostname_id`, `url`, `user_id`) VALUES ('17', 'yax.com/148g', '3');
最佳答案
您正在寻找与 COUNT DISTINCT
组合的每个主机名 ID 的聚合:
select
hostname_id,
count(*) as hostname_id_count,
count(distinct user_id) as user_id_count
from urls
group by hostname_id;
关于MYSQL 自连接与缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49231500/