2016-03-06 167 views
0

我的SQL結構:多GROUP BY和在MySQL COUNT

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可以在收藏添加許多configitems,也可以在集合中添加相同的項目,因爲他想要的。因此,我需要找到集合中添加的頂級配置項,並避免用戶在其集合中添加重複項。也就是說,如果一個用戶在一個集合中有5個相同的配置,則只能計算一個......這就是我的問題。

隨着指出:

SELECT ID,SUM(NUM)FROM(SELECT 作爲l.configitem_id ID,COUNT(DISTINCT l.configitem_id)爲num FROM COLLECTION_LINK L左側加入收藏c9_ ON l.collection_id = c9_.id LEFT JOIN user_account u2_ ON c9_.user_id = u2_.id WHERE l.configitem_id = 1121 GROUP BY u2_.id,l.configitem_id )as 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; 

但需要重複。

+1

請編輯您的帖子並添加表定義的文本,而不是圖片。 – jpw

+0

同時發佈您的工作查詢 –

+0

的結果以完成定義。 – Aize

回答

1

如果我理解正確,則需要在進行計數之前通過用戶和配置項進行聚合。或者,乾脆做一個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; 
+0

哦,戈登,非常感謝你拯救我的一天:)它是完美的作品!在COUNT中丟失DISTINCT:o – Aize