Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.07.2022, 10:56   #1
zerdb
Новичок
Джуниор
 
Регистрация: 18.07.2022
Сообщений: 1
По умолчанию Две таблицы (два вложенных запроса с COUNT() )

Доброе время суток,

в запросах не ас, просьба поправить если делаю неправильно.

Есть две таблицы:
Код:
1 -    MAIL  (id, idwho, ...)  -  список писем (id - номер письма,  idwho - id отправителя)
2 -    ISPOLNIT (idmail, idwho, status,...)     -  список исполнителей письма (idwho - id исполнителя)
нужно выбрать допустим все письма отправителя (id - 50), и добавить в выборку два поля (vsego, prinyato) подсчитав с таблицы ISPOLNIT количество исполнителей и количество статусов с текстом "Принят".

дошел до такого запроса:
Код:
select *, (select COUNT(idwho) from ISPOLNIT where idmail = MAIL.id) as vsego, (select COUNT(status) from ISPOLNIT where idmail = MAIL.id and status='Принят') as prinyato from MAIL where MAIL.idwho = '50' ORDER BY MAIL.id DESC LIMIT 200
работает как надо, только вот мне кажется что можно это как-то правильнее чтоли сделать. В общем подскажите так правильно? или как лучше составить запрос?

Последний раз редактировалось zerdb; 18.07.2022 в 11:07.
zerdb вне форума Ответить с цитированием
Старый 20.07.2022, 09:55   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
select mail.*, allsend.q as vsego, prsend.q as prinyato
from mail
left join ( select idmail, count(*) as q 
            from ispolnit
            group by idmail 
          ) as allsend on allsend.idmail =mail.id
left join ( select idmail, count(*) as q 
            from ispolnit 
            where status ='принят' 
            group by idmail 
          ) as prsend on prsend.idmail =mail.id
where mail.id =50
Код:
select mail.*, vsego, prinyat
from mail
left join ( select idmail, sum(1) as vsego, sum(case when status='принят' then 1 else 0 end) as prinyat
            from ispolnit 
            group by idmail 
          ) as allsend on allsend.idmail =mail.id
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.07.2022 в 09:58.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение таблицы с помощью запроса SQL Arya Stark SQL, базы данных 1 28.11.2017 21:21
Оптимизация запроса с count(*) sanich_23 SQL, базы данных 4 16.12.2014 16:40
Доступ к ячейкам запроса/таблицы. Kliron Microsoft Office Access 1 23.03.2010 19:17
функция запроса COUNT Таня84 БД в Delphi 1 10.06.2007 15:49