MySQL подсчитывает данные со значениями строк без нового цикла запроса

У меня 4 таблицы для рассылки новостей. Информационные бюллетени, подписчики, группы подписчиков и выбранные группы подписчиков. Я выбрал группы подписчиков в области редактирования кампании и сохранил выбранные группы в виде таблицы tbl_newsletter_groups;

tbl_newsletters

NID    title     details
1     text 1    content 1
2     text 2    content 2

tbl_subscriber_groups

GID   group_name
5    group 1
6    group 2

tbl_subscribers

SID   GID  email             name
10    5   [email protected]     sub1 name
11    6   [email protected]     sub1 name

tbl_newsletter_groups

NGID    NID   GID
15      1     6
16      1     6
17      1     6

Я хочу показать общее количество выбранных подписчиков, когда я размещаю новостные рассылки на своей странице. Мое решение работает хорошо, я ищу простое и понятное утверждение, есть ли более быстрый способ, доступный как в едином утверждении списка рассылки?

Здесь мой собственный стиль счета (да, я знаю, это слишком плохо и долгий путь);

$subGID = array();
$list = $myconn->query("SELECT * FROM tbl_newsletters");
while($listRs = $list->fetch_assoc()){
$grps = $myconn->query("SELECT * FROM tbl_newsletter_groups WHERE NID=". $listRs['NID'] ."");
while($grpsRs = $grps->fetch_asscoc()){
$subGID[] = $grpsRs['GID'];
} $grps->free();
$subs = implode(" OR GID=",$subGID);
$count = mysqli_num_rows($myconn->query("SELECT ID FROM tbl_subscribers WHERE GID=". $subs));
echo('Total Selected Subscriber: '.$count);
} $list->free();

Благодарю.

0

Решение

Требуемый термин поиска — «логика на основе множеств».

Ваше мышление здраво: вам нужно все от tbl_newslettersто вам нужно посчитать tbl_subscribers, но для того, чтобы получить те, вам нужна информация от tbl_newsletter_groups,

В SQL это признак того, что вы хотите присоединиться. Вы уже обнаружили необходимые условия, просто не знаете синтаксис. Справочное руководство может помочь там.

Теперь у вас будет куча записей, которые нужно разбить на меньшее количество записей. Вам нужны функции агрегирования и GROUP BY пункт.

Итак, вот последний запрос:

SELECT n.NID, n.title, n.details, COUNT(s.SID)
FROM   tbl_newsletters AS n
JOIN tbl_newsletter_groups AS g ON n.NID = g.NID
JOIN tbl_subscribers AS s ON g.GID = s.GID
GROUP BY n.NID
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]