簡體   English   中英

MySQL中有多個GROUP BY和COUNT

[英]Multiple GROUP BY and COUNT in MySQL

我的Sql結構:

CREATE TABLE collection (
  id int(11) NOT NULL AUTO_INCREMENT,
  user_id int(11) DEFAULT NULL,
  `name` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (id),
  KEY user_id (user_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE collection_link (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  collection_id int(11) DEFAULT NULL,
  configitem_id bigint(20) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY IDX_7CDBB51F514956FD (collection_id),
  KEY IDX_7CDBB51F9D3DD91F (configitem_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE configitem (
  id bigint(20) NOT NULL,
  PRIMARY KEY (id),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE user_account (
  id int(11) NOT NULL AUTO_INCREMENT,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


ALTER TABLE collection
  ADD CONSTRAINT FK_FC4D6532A76ED395 FOREIGN KEY (user_id) REFERENCES user_account (id),

ALTER TABLE collection_link
  ADD CONSTRAINT FK_7CDBB51F514956FD FOREIGN KEY (collection_id) REFERENCES collection (id),
  ADD CONSTRAINT FK_7CDBB51F9D3DD91F FOREIGN KEY (configitem_id) REFERENCES configitem (id);

其次,一個user_account可以在集合中添加許多配置,也可以根據需要在集合中添加相同的項目。

這樣,我需要查找添加到集合中的頂級配置項,並避免用戶在其集合中添加重復項。 如果一個用戶在一個集合中有5個相同的配置,也只能算一個...這就是我的問題。

接着就,隨即:

SELECT id,SUM(num)FROM(SELECT l.configitem_id作為id,COUNT(DISTINCT l.configitem_id)作為num FROM collection_link l LEFT JOIN集合c9_ ON l.collection_id = c9_.id LEFT JOIN user_account u2_ ON c9_.user_id = u2_ .id(其中l.configitem_id = 1121 GROUP BY u2_.id,l.configitem_id)作為cmpt;

我可以收到configitem 1121的確切計數,但如何應用於所有?

因為我所有的測試都失敗了...

這有效並需要添加前25名:

SELECT DISTINCT c2_.id AS id_0, count(c1_.id) AS sclr_1 
FROM collection_link c1_ 
LEFT JOIN configitem c2_ ON c1_.configitem_id = c2_.id 
LEFT JOIN collection c8_ ON c1_.collection_id = c8_.id 
LEFT JOIN user_account u9_ ON c8_.user_id = u9_.id 
GROUP BY c2_.id 
ORDER BY sclr_1 DESC LIMIT 25;

但需要重復。

如果我理解正確,則需要在計數之前按用戶和配置項進行匯總。 或者,只需做一個count(distinct)

SELECT c2_.id AS id_0,
       COUNT(DISTINCT u9_.id) AS sclr_1 
FROM collection_link c1_ LEFT JOIN
     configitem c2_
     ON c1_.configitem_id = c2_.id LEFT JOIN
     collection c8_
     ON c1_.collection_id = c8_.id LEFT JOIN
     user_account u9_
     ON c8_.user_id = u9_.id 
GROUP BY c2_.id 
ORDER BY sclr_1 DESC
LIMIT 25;

請注意,此版本的查詢不需要連接到用戶表:

SELECT c2_.id AS id_0,
       COUNT(DISTINCT c8_.user_id) AS sclr_1 
FROM collection_link c1_ LEFT JOIN
     configitem c2_
     ON c1_.configitem_id = c2_.id LEFT JOIN
     collection c8_
     ON c1_.collection_id = c8_.id 
GROUP BY c2_.id 
ORDER BY sclr_1 DESC
LIMIT 25;

暫無
暫無

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

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