MYSQL:每个用户的组计数特定列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL:每个用户的组计数特定列?相关的知识,希望对你有一定的参考价值。

我要使用3个表中的数据为每个特定用户计数列。

表1(用户):

CREATE TABLE `datastore`.`users` ( `uid` INT NOT NULL AUTO_INCREMENT ,  `name` VARCHAR(30) NOT NULL DEFAULT 'john' ,  `class` VARCHAR(20) NOT NULL DEFAULT 'NEW' ,    PRIMARY KEY  (`uid`)) ENGINE = InnoDB;
INSERT INTO `users` (`uid`, `name`, `class`) VALUES (NULL, 'john', 'NEW'), (NULL, 'mark', 'OLD');

样本:

uid name    class
1   john    NEW
2   mark    OLD

表2(数据):

CREATE TABLE `datastore`.`data` ( `id` INT NOT NULL AUTO_INCREMENT ,  `source` VARCHAR(30) NULL DEFAULT NULL ,  `destination` VARCHAR(30) NULL DEFAULT NULL ,    PRIMARY KEY  (`id`)) ENGINE = InnoDB;
INSERT INTO `data` (`id`, `source`, `destination`) VALUES (NULL, 'NETWORK', 'SERVER_1'), (NULL, 'STATION', 'SERVER_2'), (NULL, 'DATASTORE', 'SERVER_1');

样本:

id  source  destination
1   NETWORK     SERVER_1
2   STATION     SERVER_2
3   DATASTORE   SERVER_1

表3(访问):

CREATE TABLE `datastore`.`access` ( `id` INT(11) NOT NULL AUTO_INCREMENT ,  `uid` INT(11) NULL DEFAULT NULL ,  `source` VARCHAR(30) NULL DEFAULT NULL ,    PRIMARY KEY  (`id`)) ENGINE = InnoDB;
INSERT INTO `access` (`id`, `uid`, `source`) VALUES (NULL, '1', 'NETWORK'), (NULL, '2', 'STATION'), (NULL, '1', 'STATION'), (NULL, '1', 'STATION');

样本:

id  uid source
1   1   NETWORK
2   2   STATION
3   1   STATION
4   1   STATION

到目前为止我尝试过的事情:

SELECT access.uid, data.destination, COUNT(*) as count FROM data, access WHERE access.source = data.source GROUP BY destination, uid

结果:

uid destination count   
1   SERVER_1    1
1   SERVER_2    2
2   SERVER_2    1

我将其与用户名链接的其他内容,

所需结果:

uid name destination    count   
1   john SERVER_1       1
1   john SERVER_2       2
2   mark SERVER_2       1
答案
似乎您也需要用户加入

SELECT access.uid , users.name , data.destination , COUNT(*) as count FROM data INNER JOIN access ON access.source = data.source INNER JOIN users ON users.uid = access.uid GROUP BY destination, uid, users.name

并且作为建议,您不应基于where ..使用(旧的)隐式联接语法,而应使用显式联接语法。 
另一答案
使用聚合:

select a.uid, u.name, d.destination, count(*) from access a inner join users u on u.uid = a.uid inner join data on d.source = a.source group by a.uid, u.name, d.destination

另一答案
获得用户名所需要做的就是将查询加入表users

SELECT u.uid, u.name, t.destination, t.count FROM users u INNER JOIN ( SELECT a.uid, d.destination, COUNT(*) AS count FROM data d INNER JOIN access a ON a.source = d.source GROUP BY d.destination, a.uid ) t ON u.uid = t.uid ORDER BY u.uid, t.destination

请参见demo。结果:

| uid | name | destination | count | | --- | ---- | ----------- | ----- | | 1 | john | SERVER_1 | 1 | | 1 | john | SERVER_2 | 2 | | 2 | mark | SERVER_2 | 1 |

以上是关于MYSQL:每个用户的组计数特定列?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7 - 有没有办法在列表中显示特定的组?

计数值出现在 MySQL 中特定列中的次数

登录时获取特定列的值(C# Mysql)

每个用户的 Discord bot 特定字数计数器

如何列出各个列,其中每个列包含一个 id 计数,其中每列中的 id 不在 MySQL 中每列的不同表中

MySql:使用联合或连接按计数选择