#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. Если бы этот запрос выполнялся вообще часто, стоило бы создать представление…