使用Tcl和Mysql进行统计

使用Tcl和Mysql进行统计,mysql,tcl,Mysql,Tcl,我有一个门道的Mysql数据库 我们是一家小公司,不幸的是我不擅长编程,如果有人能帮助我,我会很高兴。我们有安全通道,每个门上都有徽章。我需要统计数据,显示他的名字和进了多少门 这就是Mysql数据库的外观: ID key ctime name floor floorid door 1 114554737 1609613062 work1 1 D1 112 2 114554737 1609662335 work

我有一个门道的Mysql数据库

我们是一家小公司,不幸的是我不擅长编程,如果有人能帮助我,我会很高兴。我们有安全通道,每个门上都有徽章。我需要统计数据,显示他的名字和进了多少门

这就是Mysql数据库的外观:

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

这让我知道哪个名字最常进哪个门

package require mysqltcl
load /usr/lib/tcltk/x86_64-linux-gnu/mysqltcl-3.052/libmysqltcl3.052.so

set db_handle [mysqlconnect -host localhost -port 3306 -user xxx -pass xx -db doors]


bind pub -|- !ustats stats:ustats


proc stats:ustats { nick uhost hand chan text } {

    global db_handle

    set maxresults 50

    set sql "SELECT count(name) as namecount, key, ctime, name, floor, floorid, door from stats GROUP by name ORDER BY nickcount DESC"

    set result [mysqlsel $db_handle $sql -list];

    if {$result > 0} {
    set counter 1

    putnow "PRIVMSG #test :\00315\[\00314!\00315\]-\[\00314Top Query Stats\00315\]"

    for {set i 0} {$i < $maxresults} {incr i} {

    set record [lindex $result $i]
    set count [lindex $record 0] 
    set key [lindex $record 1]
    set ctime [lindex $record 2]
    set name [lindex $record 3]
    set floor [lindex $record 4]
    set floorid [lindex $record 5]
    set door [lindex $record 6]


    if {$count != ""} {

    putquick "PRIVMSG #chan :$counter $count $name $door $floor $floorid"
    incr counter
    }
    }
    } 
    mysqlendquery $db_handle
}
我需要一个输出,不仅显示哪个名字打开了最多的门,而且还显示了哪些门以及打开了多少门,从左到右的大多数门最大到最小

例如:

工作2总共打开6次,1扇202门、1扇101门、1扇225门、1扇318门、1扇412门、1扇500门 工作5共打开6扇,3扇202门,2扇206门,1扇301门 工作4共打开5个,4个202门,1个201门 工作1共打开4个,2个门112,1个门115,1个门201 工作3共打开4个,3个门100个,1个门101个 你会帮我大忙的,非常感谢


这里需要的是一个稍微复杂的SQL查询。它将由子查询组成

第一个是这个。它为您获取每个名称的开门项目总数

 SELECT COUNT(*) total, name FROM stats GROUP BY name
下一个是这个。它可以为您提供每个门的开门次数和名称

SELECT COUNT(*) bydoor, name, door FROM stats GROUP BY name, door
第三个合并了第二个,每个名字对应一行,显示门打开了

选择名称, 组_concatbydoor,'X','door',按bydoor描述的门订单详细信息 从选择计数*按门, 名称 门 从统计数据 按名称、门分组 s 按名称分组 最后,您需要一个连接来将这些子查询连接在一起

   SELECT t.name, t.total, d.details
     FROM ( .... the first subquery ....) t
     JOIN ( .... the second subquery .... ) d ON t.name = d.name
    ORDER BY t.total DESC, t.name
所有的解释都是这样的。将它放入sql变量中,就可以开始了。它只是一个多行字符串

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}
所以有一个由一堆嵌套查询组成的查询

随着您在SQL数据分析方面的进步,这里有一些技巧供您学习

分组方式的使用 查询嵌套,也称为子查询。可以将子查询视为虚拟表。 高级小组讨论会。
我喜欢TCL。John Ousterhout在该语言方面做得很好。我们通常建议将SQL放在Tcl的{brages}中,将其视为一种合适的子语言。客户端也支持命名参数,至少对于DQL和DML子集是这样。您好,O.Jones,非常感谢,看起来非常好。你的工作真不错。当我在phpmyadmin中查询它时,它也可以工作,但我仍然有一个问题,我现在如何在通道中输出它?你最好再问一个关于如何输出结果的问题。我在线程中附加了这个问题