Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с запросом
 
 автор: __Андрей__   (11.01.2009 в 01:24)   письмо автору
 
 

Здравствуйте!
$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' не выводит ничего :(

Спасибо всем кто откликнулся :)

  Ответить  
 
 автор: mechanic   (11.01.2009 в 08:07)   письмо автору
 
   для: __Андрей__   (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

  Ответить  
 
 автор: __Андрей__   (12.01.2009 в 01:30)   письмо автору
 
   для: 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)

  Ответить  
 
 автор: __Андрей__   (13.01.2009 в 01:28)   письмо автору
 
   для: xx7   (12.01.2009 в 13:19)
 

Да, как и думал, предыдущий вариант не сработал. Ими можно вывести забаненых. А мне наоборот нужно.

xx7, спасиб. Попробую :)

  Ответить  
 
 автор: mechanic   (13.01.2009 в 13:29)   письмо автору
 
   для: __Андрей__   (13.01.2009 в 01:28)
 

>Да, как и думал, предыдущий вариант не сработал. Ими можно вывести забаненых. А мне наоборот нужно.

может смена условия для check_ban поможет? :D

  Ответить  
 
 автор: __Андрей__   (14.01.2009 в 00:13)   письмо автору
 
   для: mechanic   (13.01.2009 в 13:29)
 

Экспериментировал как мог. Не сработало. Код xx7 сработал :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования