MYSQL 自连接与缩减

标签 mysql sql

我有一个可怕的 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/

相关文章:

javascript - Angularjs 将表单输入保存到 php 和 Mysql

sql - 在BigQuery中格式化日期

获取 "and"多行匹配列表的 SQL 模式?

php - 编写一个可选地只显示日期之间的记录的查询

mysql - 在 JOIN 查询上使用 ORDER BY 进行排序

mysql - "groups"在此位置没有有效输入

mysql - Doctrine Deployment don t fin pdo_mysql, on Synology with console-access

mysql - 缓慢的 MySQL "INNER JOIN"

mysql:每个类别求和 3 条记录

mysql - 如何在 MySQL 中获取行位置?