Использование TCL для удаления переменной

#sql #tcl

#sql #tcl

Вопрос:

Я пытаюсь удалить имена пользователей cerain из списка, если значение count равно 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) : [0314[num [incr place]]03] 0314$user03 is 033PASSiNG03 0314>03 0303$count mile(s) this month03"
    } else {
        putnow "PRIVMSG $chan_(kadd) : [0314[num [incr place]]03] 0314$user03 is 034FAiLiNG03 0314>03 0304$count mile(s) this month03"
    }
}
  

Комментарии:

1. Казалось бы, правильным подходом было бы какое-то WHERE предложение во внешней части запроса. (Я переделал форматирование, потому что чтение запроса такой длины в одной строке затруднено и вызывает головную боль.)

Ответ №1:

Хотя здесь правильным подходом является перенос фильтрации в запрос, вы также можете сделать это на стороне 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) : [0314[num [incr place]]03] 0314$user03 is 033PASSiNG03 0314>03 0303$count mile(s) this month03"
    } else {
        putnow "PRIVMSG $chan_(kadd) : [0314[num [incr place]]03] 0314$user03 is 034FAiLiNG03 0314>03 0304$count mile(s) this month03"
    }
}
  

Без какого-либо тестирования, вот как запрос может добавить фильтр.

 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 , что перед ним всегда есть a . (Кроме того, вы знаете, что это потенциальный вектор SQL-инъекции? Предоставление пользователям любой формы сложных запросов всегда потенциально сложно, поскольку с большой мощностью появляется отличная возможность для злоупотреблений.)

Комментарии:

1. Если бы этот запрос выполнялся вообще часто, стоило бы создать представление…