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

Форум MySQL

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

 

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

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

тема: Запрос с COUNT(*) и GROUP BY
 
 автор: stalk3r   (13.09.2007 в 21:07)   письмо автору
 
 

Есть таблицы:
groups:
group_id, group_name
users:
user_id, user_group_id
Задача вывести список групп с количеством юзеров в каждой.
Проблема в том, что

SELECT group_name, COUNT(*) AS group_user_num
FROM groups, users
WHERE group_id = user_group_id
GROUP BY group_id

Не выводит групп в которых 0 юзеров.

   
 
 автор: oradev   (13.09.2007 в 22:36)   письмо автору
 
   для: stalk3r   (13.09.2007 в 21:07)
 


SELECT   g.group_id, MAX (g.group_name), COUNT (1)
    FROM groups g, users s
   WHERE g.group_id = s.user_group_id
GROUP BY g.group_id;

   
 
 автор: Trianon   (13.09.2007 в 22:38)   письмо автору
 
   для: stalk3r   (13.09.2007 в 21:07)
 


SELECT g.group_name, COALESCE(r.cnt, 0) AS user_count
  FROM groups AS g 
    LEFT JOIN (
      SELECT user_group_id, COUNT(user_id) AS cnt 
        FROM users
        GROUP BY group_id
    ) AS r ON g.group_id = r.user_group_id
  ORDER BY g.group_name

   
 
 автор: oradev   (13.09.2007 в 22:44)   письмо автору
 
   для: Trianon   (13.09.2007 в 22:38)
 

Trianon, ты ошибки в запросе на откуп кому-то даешь ?

   
 
 автор: Trianon   (14.09.2007 в 09:04)   письмо автору
 
   для: oradev   (13.09.2007 в 22:44)
 

Конечно.

   
 
 автор: stalk3r   (15.09.2007 в 11:53)   письмо автору
 
   для: Trianon   (14.09.2007 в 09:04)
 

1 запрос - не работает (иногда можно и проверять то, что пишешь, но все равно - спасибо)
2 запрос - не слишком ли он громоздкий, еще с подзапросом...

   
 
 автор: oradev   (15.09.2007 в 16:45)   письмо автору
 
   для: stalk3r   (15.09.2007 в 11:53)
 

---> 1 запрос - не работает (иногда можно и проверять то, что пишешь, но все равно - спасибо)
Вот давайте и проверим на тестовых таблицах:

SQL> SELECT   d.deptno, MAX (d.dname), COUNT (1)
  2      FROM emp e, dept d
  3     WHERE e.deptno = d.deptno
  4  GROUP BY d.deptno;

    DEPTNO MAX(D.DNAME)     COUNT(1)                                                                
---------- -------------- ----------                                                                
        10 ACCOUNTING              3                                                                
        20 RESEARCH                3                                                                
        30 SALES                   6                                                                

SQL> select * from emp;

     EMPNO ENAME                JOB              MGR HIREDATE        SAL       COMM     DEPTNO      
---------- -------------------- --------- ---------- -------- ---------- ---------- ----------      
      7369 SMITH                CLERK           7902 17.12.80        800                    20      
      7499 ALLEN                SALESMAN        7698 20.02.81       1600        300         30      
      7521 WARD                 SALESMAN        7698 22.02.81       1250        500         30      
      7566 JONES                MANAGER         7839 02.04.81       2975                    20      
      7654 MARTIN               SALESMAN        7698 28.09.81       1250       1400         30      
      7698 BLAKE                MANAGER         7839 01.05.81       2850                    30      
      7782 CLARK                MANAGER         7839 09.06.81       2450                    10      
      7839 KING                 PRESIDENT            17.11.81       5000                    10      
      7844 TURNER               SALESMAN        7698 08.09.81       1500          0         30      
      7900 JAMES                CLERK           7698 03.12.81        950                    30      
      7902 FORD                 ANALYST         7566 03.12.81       3000                    20      

     EMPNO ENAME                JOB              MGR HIREDATE        SAL       COMM     DEPTNO      
---------- -------------------- --------- ---------- -------- ---------- ---------- ----------      
      7934 MILLER               CLERK           7782 23.01.82       1300                    10      

12 строк выбрано.

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                                       
---------- -------------- -------------                                                             
        10 ACCOUNTING     NEW YORK                                                                  
        20 RESEARCH       DALLAS                                                                    
        30 SALES          CHICAGO                                                                   
        40 OPERATIONS     BOSTON                                                                    
        50 PROGRAMMING                                                                              

   
 
 автор: stalk3r   (17.09.2007 в 20:58)   письмо автору
 
   для: stalk3r   (13.09.2007 в 21:07)
 

Прошу прощения, работает.
Но не так, как надо. Опять не учитывает те группы, в которых 0 юзеров. А нужно, чтобы были и они.
2 запрос работает, спасибо.

   
 
 автор: oradev   (17.09.2007 в 21:22)   письмо автору
 
   для: stalk3r   (17.09.2007 в 20:58)
 

Ну а самому не переделать так как нужно ?


SELECT   d.deptno, MAX (d.dname) dept_name, COUNT (empno)
    FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno
GROUP BY d.deptno
ORDER BY dept_name;

   
 
 автор: stalk3r   (17.09.2007 в 22:36)   письмо автору
 
   для: oradev   (17.09.2007 в 21:22)
 

О, вот это дело. Всем спасибо - все свободны=)))

   
Rambler's Top100
вверх

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