MYSQL自我加入减少

时间:2018-03-12 09:09:34

标签: mysql sql

我有一个糟糕的MYSQL心理障碍,对于我的生活,无法弄清楚这个简单的查询。当我看到正确的答案时,我确信我会最终踢自己...其中一天。

* FINGERS CROSSED * :)

好的,所以不要笑。

Table Name: urls

    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
 ----------------------------------------------------

And This is the desired Query Result

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'); 

2 个答案:

答案 0 :(得分:1)

您正在寻找与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;

答案 1 :(得分:0)

我假设您要根据主机名和&amp ;;显示总计数。用户。 试试这个:

select
  hostname_id, 
  count(id) as total_count,
  user_id
from urls
group by hostname_id, user_id;