[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод количества записей по 6 условиям в 1 таблицу
UnWind
Здравствуйте!
Помогите пожалуйста, как правильно написать такой запрос (Сейчас каунты вернут 0, по скольку по 3 условиям из 6 количество возвращаемых записей будет ровняться 0):
SELECT COUNT( DISTINCT t1.uid ) AS `Активные пользователи`,
COUNT( DISTINCT t2.uid ) AS `Отключенные по задолжности`,
COUNT( DISTINCT t3.uid ) AS `Заблокированы администратором`,
COUNT( DISTINCT t4.uid ) AS `Заблокированы по задолжности (Активная блокировка)`,
COUNT( DISTINCT t5.uid ) AS `Лимит трафика исчерпан`,
COUNT( DISTINCT t6.uid ) AS `Договор расторгнут`
FROM billing.vgroups t1,
billing.vgroups t2,
billing.vgroups t3,
billing.vgroups t4,
billing.vgroups t5,
billing.vgroups t6
WHERE t1.blocked=0 AND # Активные пользователи
t2.blocked=1 AND # Заблокированные по балансу
t3.blocked=3 AND # Заблокирован администратором
t4.blocked=4 AND # Заблокирован по балансу
t5.blocked=5 AND # Лимит трафика исчерпан
t6.blocked=10; # Расторгнут договор

Заранее благодарю за ответ!

_____________
Искусство программирования - заставить компьютер делать всё то, что Вам делать лень!
Valick
UnWind, можно глупый вопрос? Люблю задавать глупые вопросы...
Зачем все это пихать в один запрос, да еще и таким не подобающим образом?
Сделайте 6 отдельных запросов.

_____________
Стимулятор ~yoomoney - 41001303250491
UnWind
Valick
Потому что при каждом запросе будет создаваться отдельная сессия, это раз.
Они встанут в очередь на транзакцию, это два.
В третьих это не удобно, в четвертых там очень много записей и проще сделать 1 запрос нежели 6 и из него подсчитать.
В 5тых - этот скрипт будут запускать около 300 + пользователей в минут 20ть.
Как то так в общем smile.gif
А потом по этому принципу нужно будет писать другой скрипт, для другой базы, где при этом еще выборки нужно будет делать с этими же клиентами и по ним осуществлять поиск.
Так вот - этим скриптом вообще будут пользоваться по 300 раз в минуту, т.к. менеджер обслуживает 1 клиента в минуту, касса тоже - уже 2 в минуту, при этом 16 регионов, около 10 000 менеджеров и около 50 000 касс и все каждую минуту крутят этот скрипт по 100 - 500 тысяч раз.

_____________
Искусство программирования - заставить компьютер делать всё то, что Вам делать лень!
Valick
UnWind, ну раз вам намеки не ясны, то скажу вам прямым текстом. 6 запросов будут работать быстрее, чем один с перекресным соединением 6 таблиц.
__
ну а про транзакцию на каунтах, тут я уж не знаю смеяться или плакать

_____________
Стимулятор ~yoomoney - 41001303250491
UnWind
Valick Хм. Спасибо, попробую воспользоваться Вашим вариантом. smile.gif
А намёки я действительно не понимаю вообще никогда) Так же как и шутки)
Спасибо большое!)

_____________
Искусство программирования - заставить компьютер делать всё то, что Вам делать лень!
mvg
Может запросом вывести всех должников, а скриптом, в представлении, выводить у кого, какая причина. Пых с этим легче sql справится.
Aeq
SELECT blocked, COUNT( DISTINCT uid )
FROM billing.vgroups
WHERE blocked in (0,1,3,4,5,10)
GROUP BY blocked
Aeq
только не знаю, нужен ли там DISTINCT вообще, зависит от данных о которых я ничего не знаю )
Valick
Aeq smile.gif
UnWind, сорь, я даже не глянул, что у тебя там одна таблица. Мои рекомендации из расчета 6 разных таблиц. Я еще подумал, какого хрена раскидывать эту информацию по 6 разным таблицам, но дальше мысли о хрене мысли не пошли smile.gif



_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
UnWind, у меня есть подозрение, что ты хочешь вот такой запрос сделать или что-то похожее:

SELECT 
(
SELECT COUNT( DISTINCT uid )
FROM billing.vgroups
WHERE blocked=0 # Активные пользователи
) as user_active,
(

SELECT COUNT( DISTINCT uid )
FROM billing.vgroups
WHERE blocked=1 # Заблокированные по балансу
) as blocked_balance,
.....



Ты можешь добавлять любое количество подсчетов (вместо многоточия), которые ты получишь все одной транзакцией. И в ПХП получишь все данные сразу же, в одном месте. Никаких FROM тут больше не надо! Именно так, как я написал: в начале SELECT, затем любые подвыборки, возвращающие заведомо одно значение (в данном случае целое число), каждая подвыборка записывается в свою переменную.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
mvg
Цитата (Aeq @ 12.12.2013 - 12:57)
только не знаю, нужен ли там DISTINCT вообще, зависит от данных о которых я ничего не знаю )

uid по идее unique, а с другой стороны пользователь не может одновременно быть отключенным по неуплате и активным в одно и тоже время.

Таким образом, предполагая что БД нормальная, связи упорядоченны и пр. DISTINCT не нужен. Но так, как разное бывает и исходя из того, что DISTINCT вреда запросу не принесет. Однако если uid non unique и пользователь одновременно активен и заблокирован - DISTINCT пригодиться.

P.$.
biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.