使用 TCL 删除变量

Using TCL to remove a variable

如果计数值为 0,我将尝试从列表中删除某些用户名,以便仅显示计数大于 0 的用户。我尝试了几种方法都没有成功,所以我希望能得到一些正确方向的指示

if {![mysqlsel $db_handle "
    SELECT `crew`.`user`,IF(`count`,`count`,0) AS count 
    FROM (SELECT DISTINCT `user` FROM `crew`) AS crew 
    LEFT JOIN (
        SELECT `user`,COUNT(`user`) AS count 
        FROM `info` 
        WHERE `timestamp` >= UNIX_TIMESTAMP((LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH) 
        GROUP BY `user`) AS info 
    ON crew.user = info.user $refine 
    ORDER BY `count` DESC
"]} then {
    putnow "PRIVMSG $chan_(kadd) :No results found\."
    return 0
}

mysqlmap $db_handle {user count} {
    if { $count >= $quota_(amount) || $user != "somename" } {
        putnow "PRIVMSG $chan_(kadd) : \[[=10=]314[num [incr place]][=10=]3\] [=10=]314$user[=10=]3 is [=10=]33PASSiNG[=10=]3 [=10=]314>[=10=]3 [=10=]303$count mile(s) this month[=10=]3"
    } else {
        putnow "PRIVMSG $chan_(kadd) : \[[=10=]314[num [incr place]][=10=]3\] [=10=]314$user[=10=]3 is [=10=]34FAiLiNG[=10=]3 [=10=]314>[=10=]3 [=10=]304$count mile(s) this month[=10=]3"
    }
}

虽然将过滤移动到查询中是这里的正确方法,但您也可以在 Tcl 端执行此操作,因为我敢打赌 mysqlmap 遵循标准的 Tcl 循环结果代码约定:

mysqlmap $db_handle {user count} {
    if {$count == 0} { 
        # Skip this one entirely
        continue
    }
    if { $count >= $quota_(amount) || $user != "somename" } {
        putnow "PRIVMSG $chan_(kadd) : \[[=10=]314[num [incr place]][=10=]3\] [=10=]314$user[=10=]3 is [=10=]33PASSiNG[=10=]3 [=10=]314>[=10=]3 [=10=]303$count mile(s) this month[=10=]3"
    } else {
        putnow "PRIVMSG $chan_(kadd) : \[[=10=]314[num [incr place]][=10=]3\] [=10=]314$user[=10=]3 is [=10=]34FAiLiNG[=10=]3 [=10=]314>[=10=]3 [=10=]304$count mile(s) this month[=10=]3"
    }
}

未经任何测试,以下是查询添加过滤器的方式。

if {![mysqlsel $db_handle "
    SELECT `crew`.`user`, `info`.`count` AS `count`
    FROM (SELECT DISTINCT `user` FROM `crew`) AS `crew` 
    LEFT JOIN (
        SELECT `user`, COUNT(`user`) AS `count` 
        FROM `info` 
        WHERE `timestamp` >= UNIX_TIMESTAMP((LAST_DAY(NOW()) + INTERVAL 1 DAY) - INTERVAL 1 MONTH) 
        GROUP BY `user`) AS `info` 
    ON `crew`.`user` = `info`.`user`
    WHERE `count` > 0                         -- <<< This line here <<<
    $refine 
    ORDER BY `count` DESC
"]} then {
    putnow "PRIVMSG $chan_(kadd) :No results found\."
    return 0
}

您需要调整 $refine 子句的生成,以说明它前面总是有一个 WHERE 的事实。 (此外,您知道它是一个潜在的 SQL 注入向量吗?向用户呈现任何形式的复杂查询总是可能很棘手,因为强大的功能会带来很大的滥用机会。)