У меня 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();
Благодарю.
Требуемый термин поиска — «логика на основе множеств».
Ваше мышление здраво: вам нужно все от 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
Других решений пока нет …