сортировать список foreach по метке времени Unix - PullRequest
1 голос
/ 23 апреля 2019

У меня есть этот вывод из mysql, и я хочу сначала отсортировать по самой высокой метке времени Unix.Переменная ctime имеет временную метку Unix

У меня есть adcet secend 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

и не сортируем по времени

1 Ответ

0 голосов
/ 24 апреля 2019

Как объяснено в моем комментарии, это связано с тем, что запрос (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 как таковые.

...