使用Tcl和Mysql进行统计
我有一个门道的Mysql数据库 我们是一家小公司,不幸的是我不擅长编程,如果有人能帮助我,我会很高兴。我们有安全通道,每个门上都有徽章。我需要统计数据,显示他的名字和进了多少门 这就是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
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中查询它时,它也可以工作,但我仍然有一个问题,我现在如何在通道中输出它?你最好再问一个关于如何输出结果的问题。我在线程中附加了这个问题