簡體   English   中英

MYSQL自我加入與減少

[英]MYSQL Self-JOIN With Reduction

我遇到了可怕的MYSQL思維障礙,終生無法解決這個簡單的查詢。 當我看到正確的答案時,我確定自己最終會踢自己……那一天之一。

*手指交叉* :)

好吧,別笑了。

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

您正在尋找與每個主機名ID結合使用COUNT DISTINCT的聚合:

select
  hostname_id, 
  count(*) as hostname_id_count,
  count(distinct user_id) as user_id_count
from urls
group by hostname_id;

我假設您要顯示基於主機名和用戶的總數。 嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM