将 foreach 列表排序为 unix 时间戳
sort a foreach list to unix timestamp
我有来自 mysql 的输出,我想首先排序到最高的 unix 时间戳。 ctime 变量是 unix 时间戳
我在我的代码中添加了一个 foreach i $output { 的第二个
bind pub "-|-" !grptop add:grptop
proc add:grptop {nick host handle channel text} {
global mysql
set output [AA BB CC DD EE FF]
foreach i $output {
set sql "SELECT * FROM name WHERE grp = '$i' ORDER BY ctime DESC LIMIT 1"
set result [mysqlsel $mysql $sql -list]
set record [lindex $result 0];
set name [lindex $record 2];
set ctime [lindex $record 6];
set date [clock format [lindex [split $ctime] 0] -format {%d:%m:%Y}];
putnow "PRIVMSG $channel :[=10=]314\[[=10=]307$i[=10=]314\][=10=]300 >[=10=]314 [getLongTime $ctime] [=10=]300> [=10=]314$name"
}
}
proc getLongTime {ctime} {
set date [clock format [lindex [split $ctime] 0] -format {%d:%m:%Y}];
set elapsed [duration [expr [clock seconds] - $ctime]];
regsub -all { second(s)?} $elapsed s elapsed;
regsub -all { minute(s)?} $elapsed m elapsed;
regsub -all { hour(s)?} $elapsed h elapsed;
regsub -all { day(s)?} $elapsed d elapsed;
regsub -all { week(s)?} $elapsed w elapsed;
regsub -all { month(s)?} $elapsed m elapsed;
regsub -all { year(s)?} $elapsed y elapsed;
return $elapsed;
}
输出其:
<testbot> [AA] > 1d 3h 37m 41s > testname1
<testbot> [CC] > 1y 17w 2d 7h 25m 16s > testname2
<testbot> [DD] > 2h 45m 7s > testname3
<testbot> [BB] > 1d 21h 57m 15s > testname4
<testbot> [EE] > 42m 40s > testname5
并且没有及时排序
如我的评论所述,这是由于查询 (SELECT
) 未按您的预期运行:
SELECT * FROM name WHERE grp = '$i' ORDER BY ctime DESC LIMIT 1
这 returns 每个组 (grp
) 的最新 (ctime
),但它不提供跨组的排序。为此,并根据您的确切模式,您必须将查询重写为 sth。喜欢:
SELECT n1.*
FROM name n1
WHERE ctime = (SELECT MAX(n2.ctime)
FROM name n2
WHERE n2.grp = n1.grp);
- 内部
SELECT
获取给定grp
的最新(最高,最大)时间戳。
- 外部
SELECT
获取与给定组的最新(最高、最大)时间戳相匹配的条目的详细信息。
- 您可能还想将
LIMIT 1
添加到外部 SELECT
,以防您的数据是每个时间戳(时间戳粒度)的多个条目。
这与 tcl
无关,但这并不是说您不能在 Tcl 中进行分组/过滤。
我有来自 mysql 的输出,我想首先排序到最高的 unix 时间戳。 ctime 变量是 unix 时间戳
我在我的代码中添加了一个 foreach i $output { 的第二个
bind pub "-|-" !grptop add:grptop
proc add:grptop {nick host handle channel text} {
global mysql
set output [AA BB CC DD EE FF]
foreach i $output {
set sql "SELECT * FROM name WHERE grp = '$i' ORDER BY ctime DESC LIMIT 1"
set result [mysqlsel $mysql $sql -list]
set record [lindex $result 0];
set name [lindex $record 2];
set ctime [lindex $record 6];
set date [clock format [lindex [split $ctime] 0] -format {%d:%m:%Y}];
putnow "PRIVMSG $channel :[=10=]314\[[=10=]307$i[=10=]314\][=10=]300 >[=10=]314 [getLongTime $ctime] [=10=]300> [=10=]314$name"
}
}
proc getLongTime {ctime} {
set date [clock format [lindex [split $ctime] 0] -format {%d:%m:%Y}];
set elapsed [duration [expr [clock seconds] - $ctime]];
regsub -all { second(s)?} $elapsed s elapsed;
regsub -all { minute(s)?} $elapsed m elapsed;
regsub -all { hour(s)?} $elapsed h elapsed;
regsub -all { day(s)?} $elapsed d elapsed;
regsub -all { week(s)?} $elapsed w elapsed;
regsub -all { month(s)?} $elapsed m elapsed;
regsub -all { year(s)?} $elapsed y elapsed;
return $elapsed;
}
输出其:
<testbot> [AA] > 1d 3h 37m 41s > testname1
<testbot> [CC] > 1y 17w 2d 7h 25m 16s > testname2
<testbot> [DD] > 2h 45m 7s > testname3
<testbot> [BB] > 1d 21h 57m 15s > testname4
<testbot> [EE] > 42m 40s > testname5
并且没有及时排序
如我的评论所述,这是由于查询 (SELECT
) 未按您的预期运行:
SELECT * FROM name WHERE grp = '$i' ORDER BY ctime DESC LIMIT 1
这 returns 每个组 (grp
) 的最新 (ctime
),但它不提供跨组的排序。为此,并根据您的确切模式,您必须将查询重写为 sth。喜欢:
SELECT n1.*
FROM name n1
WHERE ctime = (SELECT MAX(n2.ctime)
FROM name n2
WHERE n2.grp = n1.grp);
- 内部
SELECT
获取给定grp
的最新(最高,最大)时间戳。 - 外部
SELECT
获取与给定组的最新(最高、最大)时间戳相匹配的条目的详细信息。 - 您可能还想将
LIMIT 1
添加到外部SELECT
,以防您的数据是每个时间戳(时间戳粒度)的多个条目。
这与 tcl
无关,但这并不是说您不能在 Tcl 中进行分组/过滤。