排序一个foreach列表以Unix时间戳

时间:2019-04-23 16:53:28

标签: mysql tcl eggdrop

我有mysql的输出,我想先排序到最高的unix时间戳。 ctime变量是unix时间戳

我为我的$ add输出{到我的代码

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

且未按时间排序

1 个答案:

答案 0 :(得分:0)

正如我的评论中所述,这是由于查询(SELECT)的运行与您的期望不一致:

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

这将返回每个组(ctime)的最新(grp),但不提供跨组排序。为此,并且根据您的确切架构,必须将查询重写为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本身中进行分组/过滤。