|
|
|
| Здравствуйте!
$q_users = $DB->qu("SELECT `" . DB_PREFIX . "accounts`.`id` AS `a_id`,
`" . DB_PREFIX . "accounts`.`login` AS `a_login`,
`" . DB_PREFIX . "accounts`.`nick` AS `a_nick`,
`" . DB_PREFIX . "accounts`.`email` AS `a_email`,
`" . DB_PREFIX . "accounts`.`wmr` AS `a_wmr`,
`" . DB_PREFIX . "accounts`.`wmz` AS `a_wmz`,
`" . DB_PREFIX . "accounts`.`default_wm` AS `a_defwm`,
`" . DB_PREFIX . "accounts`.`time_of_registration` AS `a_timereg`,
`" . DB_PREFIX . "accounts`.`on_time` AS `a_ontime`,
`t_stat`.`sum` AS `all_sum`,
`t_ban`.`check_ban` AS `banned`
FROM `" . DB_PREFIX . "accounts`
LEFT JOIN (SELECT SUM(`payment`) AS `sum`, `account_id` FROM `" . DB_PREFIX . "stat`
GROUP BY `account_id`) AS `t_stat`
ON `" . DB_PREFIX . "accounts`.`id` = `t_stat`.`account_id`
LEFT JOIN (SELECT `ban` AS `check_ban`, `account_id` FROM `" . DB_PREFIX . "account_ban`
GROUP BY `account_id`) AS `t_ban`
ON `" . DB_PREFIX . "accounts`.`id` = `t_ban`.`account_id`
WHERE `t_ban`.`check_ban`='1'
ORDER BY `" . $sort_c . "` " . ($s_desc == 1 ? 'DESC' : '') );
|
Это запрос к таблице account содержащую аккаунты. Им я вывожу забаненных пользователей.
Есть таблица account_ban примерно: id|account_id|ban|time
account_ban.account_id = accounts.id
Там будут записи всех банов, и если ban в таблице содержит единицу, то это действующий бан. Если ноль, то пользователь разбанен. Если нет записей о бане соотв. айди, то пользователь и не был забанен :)
Так вот вопрос: Как мне вывести НЕ забаненных пользователей? WHERE `t_ban`.`check_ban`!='1' не выводит ничего :(
Спасибо всем кто откликнулся :) | |
|
|
|
|
|
|
|
для: __Андрей__
(11.01.2009 в 01:24)
| | должно сработать так
... FROM `" . DB_PREFIX . "accounts`
LEFT JOIN (SELECT SUM(`payment`) AS `sum`, `account_id` FROM `" . DB_PREFIX . "stat`
GROUP BY `account_id`) AS `t_stat`
ON `" . DB_PREFIX . "accounts`.`id` = `t_stat`.`account_id`
JOIN (SELECT `ban` AS `check_ban`, `account_id` FROM `" . DB_PREFIX . "account_ban`
GROUP BY `account_id`) AS `t_ban`
ON `" . DB_PREFIX . "accounts`.`id` = `t_ban`.`account_id` AND `t_ban`.`check_ban`='1'
ORDER BY ...
|
да и вообще мне не нравятся вложенные селекты там, где они реально не нужны.
я бы запрос переписал так
"SELECT `accs`.`id` AS `a_id`,
`accs`.`login` AS `a_login`,
`accs`.`nick` AS `a_nick`,
`accs`.`email` AS `a_email`,
`accs`.`wmr` AS `a_wmr`,
`accs`.`wmz` AS `a_wmz`,
`accs`.`default_wm` AS `a_defwm`,
`accs`.`time_of_registration` AS `a_timereg`,
`accs`.`on_time` AS `a_ontime`,
SUM(`t_stat`.`payment`) AS `all_sum`,
`t_ban`.`ban` AS `banned`
FROM `" . DB_PREFIX . "accounts` as `accs`
LEFT JOIN `" . DB_PREFIX . "stat` AS `t_stat` ON `accs`.`id` = `t_stat`.`account_id`
LEFT JOIN `" . DB_PREFIX . "account_ban` AS `t_ban` ON `accs`.`id` = `t_ban`.`account_id`
WHERE `t_ban`.`check_ban`='1'
GROUP BY `accs`.`id`
ORDER BY `" . $sort_c . "` " . ($s_desc == 1 ? 'DESC' : '')
|
вроде ничего не забыл
так и запрос чище
а если известно, что на каждую запись в accounts обязательно приходится запись в stat и в account_ban, то можно left join для скорости заменить на join | |
|
|
|
|
|
|
|
для: mechanic
(11.01.2009 в 08:07)
| | Спасибо. Буду пробовать. Но что-то мне подсказывает, что это не то :) Мне надо вывести всех тех из accounts, чьего account_id либо не существует в account_ban, либо ban в account_ban не равно 1. | |
|
|
|
|
автор: xx7 (12.01.2009 в 13:19) |
|
|
для: __Андрей__
(12.01.2009 в 01:30)
| | WHERE ! IFNULL(`t_ban`.`check_ban` , 0) | |
|
|
|
|
|
|
|
для: xx7
(12.01.2009 в 13:19)
| | Да, как и думал, предыдущий вариант не сработал. Ими можно вывести забаненых. А мне наоборот нужно.
xx7, спасиб. Попробую :) | |
|
|
|
|
|
|
|
для: __Андрей__
(13.01.2009 в 01:28)
| | >Да, как и думал, предыдущий вариант не сработал. Ими можно вывести забаненых. А мне наоборот нужно.
может смена условия для check_ban поможет? :D | |
|
|
|
|
|
|
|
для: mechanic
(13.01.2009 в 13:29)
| | Экспериментировал как мог. Не сработало. Код xx7 сработал :) | |
|
|
|