扩展统计 mysql 和 tcl

extension statistic mysql and tcl

我问了一个问题并从@O 那里得到了很好的解决方案。琼斯,非常感谢。

不幸的是,我不得不用一个专栏 building

来扩展 mysql 数据库

我现在还需要,给每个,楼,最benutt取名字

举个例子,在work1,A1是使用最多的建筑,at work2是B1

ID  key         ctime       name    floor   floorid door    building
1   114554737   1609613062  work1   1       D1      112     A1
2   114554737   1609662335  work1   1       D1      112     A1
3   114554737   1609662388  work1   1       D1      115     A2
4   114554737   1609665480  work1   2       D1      201     C1
5   114554738   1609701179  work2   2       D1      202     A1
6   114554738   1609701188  work2   1       D1      101     B1
7   114554738   1609701195  work2   2       D1      225     B1
8   114554738   1609701253  work2   3       D1      318     B1
9   114554738   1609707953  work2   4       D1      412     C1
10  114554738   1609876824  work2   5       D1      500     C1
11  114554739   1609956064  work3   1       D1      100     C1
12  114554739   1609956067  work3   1       D1      101     A1
13  114554739   1610084925  work3   1       D1      100     A1
14  114554739   1610084928  work3   1       D1      100     A1
15  114554740   1610141106  work4   2       D1      201     A1
16  114554740   1610141109  work4   2       D1      202     A1
17  114554740   1610177322  work4   2       D1      202     A1
18  114554740   1610178412  work4   2       D1      202     A1
19  114554740   1610207104  work4   2       D1      202     A1
20  114554741   1610216851  work5   2       D1      202     A1
21  114554741   1610268582  work5   2       D1      202     A1
22  114554741   1610268908  work5   2       D1      202     A1
23  114554741   1610271923  work5   2       D1      206     A1
24  114554741   1610275117  work5   2       D1      206     A1
25  114554741   1610293137  work5   3       D1      301     A1

我使用 O. Jone 的回答中的这个查询

 set sql {SELECT t.name, t.total, d.details
   FROM (SELECT COUNT(*) total, name FROM stats GROUP BY name) t
   JOIN (  SELECT name, 
                  GROUP_CONCAT(CONCAT(bydoor,'X',' door ', door) ORDER BY bydoor DESC) details
             FROM (   SELECT COUNT(*) bydoor,
                             name,
                             door
                        FROM stats
                       GROUP BY name, door
                  ) s
            GROUP BY name
         ) d ON t.name = d.name
   ORDER BY t.total DESC, t.name}

对象计数的一个问题是,如果有两个建筑物的计数相同怎么办。

我更改了数据来演示问题。

GORUP_CONCAT 也可以按任何可用的列排序

例如GROUP_CONCAT(建筑ORDER BY建筑) AS 建筑``

CREATE TABLE stats (
  `ID` INTEGER,
  `key` INTEGER,
  `ctime` INTEGER,
  `name` VARCHAR(5),
  `floor` INTEGER,
  `floorid` VARCHAR(2),
  `door` INTEGER,
  `building` VARCHAR(2)
);

INSERT INTO stats
  (`ID`, `key`, `ctime`, `name`, `floor`, `floorid`, `door`, `building`)
VALUES
  ('1', '114554737', '1609613062', 'work1', '1', 'D1', '112', 'A1'),
  ('2', '114554737', '1609662335', 'work1', '1', 'D1', '112', 'A1'),
  ('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'),
    ('3', '114554737', '1609662388', 'work1', '1', 'D1', '115', 'A2'),
  ('4', '114554737', '1609665480', 'work1', '2', 'D1', '201', 'C1'),
  ('5', '114554738', '1609701179', 'work2', '2', 'D1', '202', 'A1'),
  ('6', '114554738', '1609701188', 'work2', '1', 'D1', '101', 'B1'),
  ('7', '114554738', '1609701195', 'work2', '2', 'D1', '225', 'B1'),
  ('8', '114554738', '1609701253', 'work2', '3', 'D1', '318', 'B1'),
  ('9', '114554738', '1609707953', 'work2', '4', 'D1', '412', 'C1'),
  ('10', '114554738', '1609876824', 'work2', '5', 'D1', '500', 'C1'),
  ('11', '114554739', '1609956064', 'work3', '1', 'D1', '100', 'C1'),
  ('12', '114554739', '1609956067', 'work3', '1', 'D1', '101', 'A1'),
  ('13', '114554739', '1610084925', 'work3', '1', 'D1', '100', 'A1'),
  ('14', '114554739', '1610084928', 'work3', '1', 'D1', '100', 'A1'),
  ('15', '114554740', '1610141106', 'work4', '2', 'D1', '201', 'A1'),
  ('16', '114554740', '1610141109', 'work4', '2', 'D1', '202', 'A1'),
  ('17', '114554740', '1610177322', 'work4', '2', 'D1', '202', 'A1'),
  ('18', '114554740', '1610178412', 'work4', '2', 'D1', '202', 'A1'),
  ('19', '114554740', '1610207104', 'work4', '2', 'D1', '202', 'A1'),
  ('20', '114554741', '1610216851', 'work5', '2', 'D1', '202', 'A1'),
  ('21', '114554741', '1610268582', 'work5', '2', 'D1', '202', 'A1'),
  ('22', '114554741', '1610268908', 'work5', '2', 'D1', '202', 'A1'),
  ('23', '114554741', '1610271923', 'work5', '2', 'D1', '206', 'A1'),
  ('24', '114554741', '1610275117', 'work5', '2', 'D1', '206', 'A1'),
  ('25', '114554741', '1610293137', 'work5', '3', 'D1', '301', 'A1');
SELECT 
    t.name, t.total, d.details, t1.`building`
FROM
    (SELECT 
        COUNT(*) total, name
    FROM
        stats
    GROUP BY name) t
        JOIN
    (SELECT 
        name,
            GROUP_CONCAT(CONCAT(bydoor, 'X', ' door ', door)
                ORDER BY bydoor DESC) details
    FROM
        (SELECT 
        COUNT(*) bydoor, name, door
    FROM
        stats
    GROUP BY name , door) s
    GROUP BY name) d ON t.name = d.name
        INNER JOIN
    (SELECT 
        `name`,
            GROUP_CONCAT(`building`) AS `building`,
            buildingcount
    FROM
        (SELECT 
        `name`, `building`, COUNT(`building`) buildingcount
    FROM
        stats s
    GROUP BY name , `building`
    HAVING buildingcount = (SELECT 
            COUNT(`building`)
        FROM
            stats
        WHERE
            `name` = s.`name`
        GROUP BY name , `building`
        ORDER BY COUNT(`building`) DESC
        LIMIT 1)) t3
    GROUP BY `name` , buildingcount) t1 ON t1.`name` = t.`name`
ORDER BY t.total DESC , t.name
name  | total | details                                                                 | building
:---- | ----: | :---------------------------------------------------------------------- | :-------
work2 |     6 | 1X door 500,1X door 412,1X door 318,1X door 225,1X door 202,1X door 101 | B1      
work5 |     6 | 3X door 202,2X door 206,1X door 301                                     | A1      
work1 |     5 | 2X door 115,2X door 112,1X door 201                                     | A2,A1   
work4 |     5 | 4X door 202,1X door 201                                                 | A1      
work3 |     4 | 3X door 100,1X door 101                                                 | A1      
SELECT `name`,GROUP_CONCAT(`building`), buildingcount
FROM
(SELECT  `name`, `building`,COUNT(`building`) buildingcount
FROM stats s
GROUP BY name,`building`
HAVING buildingcount = (SELECT COUNT(`building`) FROM stats WHERE  `name` = s.`name`
GROUP BY name,`building`
ORDER BY COUNT(`building`) DESC LIMIT 1)) t3
GROUP BY `name`, buildingcount
name  | GROUP_CONCAT(`building`) | buildingcount
:---- | :----------------------- | ------------:
work1 | A1,A2                    |             2
work2 | B1                       |             3
work3 | A1                       |             3
work4 | A1                       |             5
work5 | A1                       |             6

db<>fiddle here