1

我有这个来自 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 :\00314\[\00307$i\00314\]\00300 >\00314 [getLongTime $ctime] \00300> \00314$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

并且没有及时排序

4

1 回答 1

0

正如我在评论中所解释的,这是由于查询 ( SELECT) 的运行不符合您的期望:

SELECT * FROM name WHERE grp = '$i' ORDER BY ctime DESC LIMIT 1

ctime这将返回每个组 ( )的最新 ( grp),但它不提供跨组的排序。为此,根据您的确切架构,您必须将查询重写为某事。喜欢:

SELECT n1.*
FROM name n1
WHERE ctime = (SELECT MAX(n2.ctime)
               FROM name n2
               WHERE n2.grp = n1.grp);
  • 内部SELECT获取给定的最新(最高,最大)时间戳grp
  • 外部SELECT获取与给定组的最新(最高,最大)时间戳匹配的条目的详细信息。
  • 您可能还想添加LIMIT 1到 outher SELECT,以防您的数据作为每个时间戳的多个条目(时间戳粒度)。

然而,这不是关于tcl,这并不是说您不能在 Tcl 本身中进行分组/过滤。

于 2019-04-24T05:58:39.943 回答